wake-up-neo.com

Benutzerdefinierte Post-Typ-Vorlagen aus dem Plugin-Ordner?

Ich möchte meinen benutzerdefinierten Beitragstyp als Plugin anbieten, damit die Benutzer ihn verwenden können, ohne ihren Themenordner zu berühren. Im Themenordner befinden sich jedoch benutzerdefinierte Vorlagen für Posts (z. B. "single-movies.php"). Gibt es eine Möglichkeit, WP zu veranlassen, nach einer single-movies.php im Ordner des Plugins zu suchen? Eine Funktion in die Filer-Hierarchie einbinden ? Oder get_template_directory (); ?

55
nathanbweb

Sie können single_template filter hook verwenden.

/* 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;

}
87
Bainternet

Aktualisierte Antwort

Sauberere und kürzere Version.

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

Alte Antwort

@Brainternet-Antwort wurde eine Prüfung für eine benutzerdefinierte posttypspezifische Vorlage im Themenordner hinzugefügt.

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

Jetzt können Sie den Plugin-Benutzern erlauben, die Vorlage von Ihrem Plugin in ihr Design zu kopieren, um sie zu überschreiben.

In diesem Beispiel müssen sich Vorlagen im Stammverzeichnis des Plugins und des Themas befinden.

18
campsjos

Ich möchte darauf hinweisen, dass es bei Verwendung der Filtermethode äußerst wichtig ist, den Filter wie folgt zu priorisieren:

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

Wenn Sie dies nicht tun, versucht WP manchmal, nach diesem Filter eine erneute Überprüfung durchzuführen. Zog mir aus diesem Grund etwa 2 Stunden lang die Haare aus.

3
RBizzle