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

Как добавить пользовательский модуль для темы Divi WordPress? http://www.elegantthemes.com/gallery/divi/

Исходные модули создаются в main-modules.php

Пример:

class ET_Builder_Module_Gallery extends ET_Builder_Module { .... } 

Но класс ET_Builder_Module недоступен в моем плагине или в теме functions.php

Большинство других решений здесь слишком сложны. Самый простой способ – загрузить свой настраиваемый модуль в конкретный крючок действия divi et_builder_ready , например:

 add_action( 'et_builder_ready', 'evr_initialize_divi_modules' ); function evr_initialize_divi_modules() { if ( ! class_exists( 'ET_Builder_Module' ) ) { return; } class EVR_Builder_Module_Testimonial extends ET_Builder_Module { function init() { $this->name = esc_html__( 'Testimonial', 'evr' ); $this->slug = 'evr_pb_testimonial'; $this->fb_support = true; // ... } } } 

Вы можете найти полный демо-код на github. Наряду с некоторыми инструкциями, как заставить его работать во всех новых конструкторах Divi 3:

https://github.com/stracker-phil/divi3-vb-custom-modules/

Поместите ниже в свой файл functions.php. Файл include (я называл его custom-modules.php) будет классом, который расширяет ET_Builder_Module (который очень похож на WP_Widget). Просто откройте файл из Divi >> включает >> builder >> main-modules.php. Используйте любой из существующих модулей в качестве примера или основы для вашего нового. Скопируйте и вставьте в свой 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(); } в 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(); } 

Приведенный выше код не работает. Функция также должна быть вызвана.

Вот пример с рабочим кодом из https://divi.space/blog/adding-custom-modules-to-divi/

 function DS_Custom_Modules(){ if(class_exists("ET_Builder_Module")){ include("ds-custom-modules.php"); } } function Prep_DS_Custom_Modules(){ 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' ); $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']; $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, 'DS_Custom_Modules', 9789); } } Prep_DS_Custom_Modules(); в function DS_Custom_Modules(){ if(class_exists("ET_Builder_Module")){ include("ds-custom-modules.php"); } } function Prep_DS_Custom_Modules(){ 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' ); $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']; $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, 'DS_Custom_Modules', 9789); } } Prep_DS_Custom_Modules(); 

Я хочу попытаться урегулировать здесь небольшие дебаты. класс ET_Builder_Module_Custom_Module расширяет ET_Builder_Module {}, и main-modules.php могут быть изменены свободно, если используется дочерняя тема . Недавно я осквернил тему Divi, и после обновления все работало как шарм.

Примечание. Всегда рекомендуется проверять, есть ли обновления в файлах, которые вы используете внутри дочерней темы, потому что иногда вам также может понадобиться обновить дочерние файлы.

Надеюсь, это помогло всем будущим читателям этой должности.

HFGL с новыми модулями, которые вы собираетесь создать;)

Важное примечание . Пул для вашего настраиваемого модуля должен содержать строку et_pb_ , или она будет отфильтрована функцией et_pb_allowed_modules_list() .

Я смог добавить новый модуль Divi, используя следующий код (для анонимной функции требуется PHP 5.3+):

 add_action(is_admin() ? 'wp_loaded' : 'wp', function() { require __DIR__ . '/custom-divi-module.php'; }, 20); 

Внутри включенного файла скопируйте и вставьте class из файла wp-content/themes/Divi/includes/builder/main-modules.php , а затем измените его в соответствии с вашими потребностями. См. Пример ниже (скопируйте фактический класс из упомянутого файла, чтобы получить содержание каждого метода, перечисленного ниже … Мне нравится класс ET_Builder_Module_Code для простоты):

 class YOUR_MODULE_NAME extends ET_Builder_Module { function init() { // Name, slug, and some other settings for the module go here } function get_fields() { // This method returns an array of fields that the module will // display as the module settings } function shortcode_callback($atts, $content = null, $function_name) { // This method returns the content the module will display } } new YOUR_MODULE_NAME; 

Вы можете сделать это, изменив файлы темы Divi (что плохо)

Например, вы можете изменить main-modules.php, чтобы добавить новый модуль:

 class ET_Builder_Module_Custom_Module extends ET_Builder_Module { function init() { $this->name = __( 'My Module', 'et_builder' ); $this->slug = 'et_pb_custom_module'; 

После этого вам нужно добавить панель для customizer в functions.php:

 /* Section: Custom Module */ $wp_customize->add_section( 'et_pagebuilder_custom_module', array( 'priority' => 220, 'capability' => 'edit_theme_options', 'title' => __( 'My Module', 'Divi' ), // 'description' => '', ) ); 

Если вы выполните поиск в functions.php, вы найдете, где его легко добавить;)