C'est la fonction get_template_part par défaut dans 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);
}
J'essaie d'utiliser cette action pour localiser le fichier de boucle de type post personnalisé à partir du plugin:
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 );
J'ai besoin d'une solution qui
Mise à jour: c'est le code qui appelle un modèle de partie dans le thème:
global $post;
get_template_part( 'templates/loop', $post->post_type );
/**
*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;
}
Puis utilisez la fonction mec_get_admin_menu_page($slug, $name = null);
n'importe où dans vos fichiers de plug-in, comme la fonction get_template_part($slug, $name = null)
.
mec_get_admin_menu_page('custom-page','one');
L'exemple de fonction ci-dessus recherche le fichier custom-page-one.php
dans votre PLUGIN_DIR_PATH
et le charge.
Aussi, je vous recommande d'utiliser:
define('PLUGIN_DIR_PATH', plugin_dir_path(__FILE__));
pour définir votre chemin de répertoire de plugin.
Vous devez vous connecter au filtre template_include, par exemple.
add_filter('template_include', 'my_function_name');
function my_function_name( $template ) {
if ("example" == $name){
$template = dirname( __FILE__ ) . '/my-template.php';
}
return $template;
}
J'ai posé cette question il y a quelques années et je l'ai utilisée plusieurs fois depuis pour des projets :)