Modèles de type de message personnalisé à partir du dossier du plug-in?

48

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 demander à WP de rechercher un fichier single-movies.php dans le dossier du plug-in? Accrocher une fonction à la Hiérarchie des fichiers ? Ou get_template_directory (); ?

    
posée nathanbweb 16.05.2011 - 15:16

4 réponses

79

Vous pouvez utiliser le crochet de filtrage 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;

}
    
réponse donnée Bainternet 16.05.2011 - 15:41
15

Réponse mise à jour

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');

Ancienne réponse

Ajout d'une vérification pour un modèle spécifique à un type de publication 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.

    
réponse donnée campsjos 15.01.2016 - 10:45
2

Je tiens à souligner que lorsque vous utilisez la méthode de filtrage pour cela, il est extrêmement important de hiérarchiser le filtre comme suit:

add_filter('single_template', 'my_custom_template', 99);

Si vous ne le faites pas, parfois, WP tentera de revérifier après ce filtre. J'arrachais mes cheveux à cause de ça pendant 2 heures.

    
réponse donnée RBizzle 14.12.2016 - 17:33
-2

La réponse ci-dessus est excellente, mais la vérification de la variable $ single permet au modèle de remplacer un modèle si celui-ci est fourni par le thème theme / child.

/* Filter the single_template with our custom function*/
add_filter('single_template', 'your_cpt_custom_template');

function your_cpt_custom_template( $single ) {
    global $wp_query, $post;
    /* Checks for single template by post type */
    if ( !$single && $post->post_type == 'cpt' ) {
        if( file_exists( plugin_dir_path( __FILE__ ) . 'single-cpt.php' ) )
            return plugin_dir_path( __FILE__ ) . 'single-cpt.php';
    }
    return $single;
}
    
réponse donnée DigitalDesignDj 19.10.2015 - 18:47

Lire d'autres questions sur les étiquettes