get_template_part из плагина

Это функция get_template_part по умолчанию в WordPress:

function get_template_part( $slug, $name = null ) { do_action( "get_template_part_{$slug}", $slug, $name ); $templates = array(); if ( isset($name) ) $templates[] = "{$slug}-{$name}.php"; $templates[] = "{$slug}.php"; locate_template($templates, true, false); } 

Я пытаюсь использовать это действие для поиска настраиваемого файла цикла post type из плагина:

 add_action( "get_template_part_templates/loop", function($slug, $name){ if ("example" == $name){ if (!locate_template("templates/loop-{$name}.php", false, false)){ /* What do you suggest to do here? */ } } },10,2 ); 

Мне нужно решение, которое;

  1. Проверьте, есть ли у темы файлы для «примерного» типа пользовательских сообщений
  2. Если у вас нет; использовать файлы шаблонов плагина для показа и не использовать решение по умолчанию для темы

Обновление: это код, вызывающий часть шаблона в теме:

 global $post; get_template_part( 'templates/loop', $post->post_type ); 

Solutions Collecting From Web of "get_template_part из плагина"

/** *Extend WP Core get_template_part() function to load files from the within Plugin directory defined by PLUGIN_DIR_PATH constant * * Load the page to be displayed * from within plugin files directory only * * @uses mec_locate_admin_menu_template() function * * @param $slug * @param null $name */ function mec_get_admin_menu_page($slug, $name = null) { do_action("mec_get_admin_menu_page_{$slug}", $slug, $name); $templates = array(); if (isset($name)) $templates[] = "{$slug}-{$name}.php"; $templates[] = "{$slug}.php"; mec_locate_admin_menu_template($templates, true, false); } /* Extend locate_template from WP Core * Define a location of your plugin file dir to a constant in this case = PLUGIN_DIR_PATH * Note: PLUGIN_DIR_PATH - can be any folder/subdirectory within your plugin files */ function mec_locate_admin_menu_template($template_names, $load = false, $require_once = true ) { $located = ''; foreach ( (array) $template_names as $template_name ) { if ( !$template_name ) continue; /* search file within the PLUGIN_DIR_PATH only */ if ( file_exists(PLUGIN_DIR_PATH . '/' . $template_name)) { $located = PLUGIN_DIR_PATH . '/' . $template_name; break; } } if ( $load && '' != $located ) load_template( $located, $require_once ); return $located; }
/** *Extend WP Core get_template_part() function to load files from the within Plugin directory defined by PLUGIN_DIR_PATH constant * * Load the page to be displayed * from within plugin files directory only * * @uses mec_locate_admin_menu_template() function * * @param $slug * @param null $name */ function mec_get_admin_menu_page($slug, $name = null) { do_action("mec_get_admin_menu_page_{$slug}", $slug, $name); $templates = array(); if (isset($name)) $templates[] = "{$slug}-{$name}.php"; $templates[] = "{$slug}.php"; mec_locate_admin_menu_template($templates, true, false); } /* Extend locate_template from WP Core * Define a location of your plugin file dir to a constant in this case = PLUGIN_DIR_PATH * Note: PLUGIN_DIR_PATH - can be any folder/subdirectory within your plugin files */ function mec_locate_admin_menu_template($template_names, $load = false, $require_once = true ) { $located = ''; foreach ( (array) $template_names as $template_name ) { if ( !$template_name ) continue; /* search file within the PLUGIN_DIR_PATH only */ if ( file_exists(PLUGIN_DIR_PATH . '/' . $template_name)) { $located = PLUGIN_DIR_PATH . '/' . $template_name; break; } } if ( $load && '' != $located ) load_template( $located, $require_once ); return $located; } 

Затем используйте mec_get_admin_menu_page($slug, $name = null); функции в любом месте ваших файлов плагинов, таких как get_template_part($slug, $name = null) .

 mec_get_admin_menu_page('custom-page','one'); 

Вышеупомянутая функция образца будет искать файл custom-page-one.php внутри вашего PLUGIN_DIR_PATH и загружает его.

Также я рекомендую вам использовать:

 define('PLUGIN_DIR_PATH', plugin_dir_path(__FILE__)); 

для определения пути к каталогу плагина.

Вам нужно подключиться к фильтру template_include, например

 add_filter('template_include', 'my_function_name'); function my_function_name( $template ) { if ("example" == $name){ $template = dirname( __FILE__ ) . '/my-template.php'; } return $template; } 

Я спросил об этом здесь пару лет назад и несколько раз использовал его для проектов 🙂