J'aimerais proposer mon type de message personnalisé sous forme de plug-in, afin que les gens puissent l'utiliser sans toucher à leur dossier de thèmes. Toutefois, les modèles de type de publication personnalisés, tels que single-movies.php, résident dans le dossier du thème. Existe-t-il un moyen de permettre à WP de rechercher un fichier single-movies.php dans le dossier du plug-in? Accrocher une fonction dans la hiérarchie Filer ? Ou get_template_directory (); ?
Vous pouvez utiliser le crochet de filtre single_template
.
/* Filter the single_template with our custom function*/
add_filter('single_template', 'my_custom_template');
function my_custom_template($single) {
global $post;
/* Checks for single template by post type */
if ( $post->post_type == 'POST TYPE NAME' ) {
if ( file_exists( PLUGIN_PATH . '/Custom_File.php' ) ) {
return PLUGIN_PATH . '/Custom_File.php';
}
}
return $single;
}
Version plus propre et plus courte.
function load_movie_template($template) {
global $post;
if ($post->post_type == "movie" && $template !== locate_template(array("single-movie.php"))){
/* This is a "movie" post
* AND a 'single movie template' is not found on
* theme or child theme directories, so load it
* from our plugin directory
*/
return plugin_dir_path( __FILE__ ) . "single-movie.php";
}
return $template;
}
add_filter('single_template', 'load_movie_template');
Ajout d'une vérification pour un modèle spécifique au type de message personnalisé dans le dossier du thème à @Brainternet answer.
function load_cpt_template($template) {
global $post;
// Is this a "my-custom-post-type" post?
if ($post->post_type == "my-custom-post-type"){
//Your plugin path
$plugin_path = plugin_dir_path( __FILE__ );
// The name of custom post type single template
$template_name = 'single-my-custom-post-type.php';
// A specific single template for my custom post type exists in theme folder? Or it also doesn't exist in my plugin?
if($template === get_stylesheet_directory() . '/' . $template_name
|| !file_exists($plugin_path . $template_name)) {
//Then return "single.php" or "single-my-custom-post-type.php" from theme directory.
return $template;
}
// If not, return my plugin custom post type template.
return $plugin_path . $template_name;
}
//This is not my custom post type, do nothing with $template
return $template;
}
add_filter('single_template', 'load_cpt_template');
Vous pouvez maintenant laisser les utilisateurs du plug-in copier le modèle de votre plug-in dans leur thème pour le remplacer.
Dans cet exemple, les modèles doivent figurer dans le répertoire racine du plugin et du thème.
Je tiens à souligner que lorsque vous utilisez la méthode de filtrage pour cela, il est extrêmement important de hiérarchiser le filtre de la manière suivante:
add_filter('single_template', 'my_custom_template', 99);
Si vous ne le faites pas, parfois WP tentera de vérifier à nouveau après ce filtre. J'arrachais mes cheveux à cause de ça pendant 2 heures.