Как правильно и безопасно добавить собственный модуль в Divi

ВОПРОС

Сейчас я работаю с темой Divi и мне не очень хватает тех блоков, которые она предоставляет. Поэтому я хочу попробовать добавить пару своих элементов. Сделать сами элементы – не проблема. Трудности начинаются тогда, когда нужно их интегрировать в макет. Но, обо всем по порядку.
Все оригинальные модули макета создаются в main-modules. Вот пример:

class ET_Builder_Module_Gallery extends ET_Builder_Module { …. }

Но проблема в том, класс что ET_Builder, через который можно все провернуть, мне недоступен. И я вообще не знаю, как получить к нему доступ. Плагины и functions.php здесь не помогают. Надеюсь, у вас есть какие-нибудь идеи.

Полезно : Аналоги визуальных конструкторов Elementor и Visual Composer(Откроется в новой вкладке браузера)

ОТВЕТ

Не знаю, получиться ли что-то сделать через расширения. Но вот через functions вставить пару новых блоков вполне реально. Можно включить класс, который будет расширять ET_Builder_Module. Вполне достаточно просто открыть файл с элементами твоего шаблона и взять любой из них в качестве основы для своего. Затем тебе нужно просто скопировать, а затем вставить код в custom-modules.php. И дальше по мере необходимости уже ты можешь вносить свои изменения. Вот сам код:

function doCustomModules(){
if(class_exists(“ET_Builder_Module”)){
include(“custom-modules.php”);
}
}
function prepareCustomModule(){
global $pagenow;
$is_admin = is_admin();
$action_hook = $is_admin ? ‘wp_loaded’ : ‘wp’;
$required_admin_pages = array( ‘edit.php’, ‘post.php’, ‘post-new.php’, ‘admin.php’, ‘customize.php’, ‘edit-tags.php’, ‘admin-ajax.php’, ‘export.php’ ); // list of admin pages where we need to load builder files
$specific_filter_pages = array( ‘edit.php’, ‘admin.php’, ‘edit-tags.php’ ); // list of admin pages where we need more specific filtering
$is_edit_library_page = ‘edit.php’ === $pagenow && isset( $_GET[‘post_type’] ) && ‘et_pb_layout’ === $_GET[‘post_type’];
$is_role_editor_page = ‘admin.php’ === $pagenow && isset( $_GET[‘page’] ) && ‘et_divi_role_editor’ === $_GET[‘page’];
$is_import_page = ‘admin.php’ === $pagenow && isset( $_GET[‘import’] ) && ‘wordpress’ === $_GET[‘import’]; // Page Builder files should be loaded on import page as well to register the et_pb_layout post type properly
$is_edit_layout_category_page = ‘edit-tags.php’ === $pagenow && isset( $_GET[‘taxonomy’] ) && ‘layout_category’ === $_GET[‘taxonomy’];
if ( ! $is_admin || ( $is_admin && in_array( $pagenow, $required_admin_pages ) && ( ! in_array( $pagenow, $specific_filter_pages ) || $is_edit_library_page || $is_role_editor_page || $is_edit_layout_category_page || $is_import_page ) ) ) {
add_action($action_hook, ‘doCustomModules’, 9789);
}
}
$theme_data = wp_get_theme();
$parent_data = $theme_data->parent();
if(version_compare((string)$parent_data->Version, “2.5.9”, “>”)) {
add_action(‘et_builder_ready’, ‘doCustomModules’);
} else {
doCustomModule();
}

В целом, я думаю что этот способ должен сработать. Все-таки система довольно гибкая, а поэтому ее всегда можно подстроить под себя.