it-swarm.com.de

Laden einer benutzerdefinierten Seitenvorlage über das Plugin

Ich verfolge ein ziemlich veraltetes Tutorial zu benutzerdefinierten Beitragstypen und der letzte Schritt ist das Erstellen einer benutzerdefinierten Seitenvorlage, in der alle Beiträge des benutzerdefinierten Typs im Archivlistenformat angezeigt werden sollen. Gemäß den Kommentaren funktionieren die verwendeten Methoden 6 Jahre später nicht mehr (siehe Abbildung), und meine benutzerdefinierte Seitenvorlage ist beim Erstellen einer neuen Seite keine Option.

Wenn ich meine benutzerdefinierte Vorlage in den Themenordner lege, funktioniert sie, aber die Option, sie aus dem Plugin-Verzeichnis zu laden, ist nicht mehr verfügbar. Wie kann ich das beheben, damit ich die Vorlage einer neuen Seite zuweisen kann?

Bearbeiten

Wie ich jetzt besser verstehe, wird mit diesem Code nur die Vorlage geladen, wenn meine benutzerdefinierten Beitragstypen angezeigt werden. Die Verwirrung war darauf zurückzuführen, dass es im Abschnitt "Seitenattribute" als verfügbare Vorlage angezeigt wurde, als es sich im Themenverzeichnis befand. Ich möchte es beim Erstellen einer neuen Seite als Option zur Verfügung haben, aber die Vorlagendatei befindet sich im Verzeichnis meines Plugins.

Der Originalcode aus dem Tutorial:

add_filter( 'template_include', 'include_template_function', 1 );

function include_template_function( $template_path ) {
    if ( get_post_type() == 'movie_reviews' ) {
        if ( is_single() ) {
            // checks if the file exists in the theme first,
            // otherwise serve the file from the plugin
            if ( $theme_file = locate_template( array ( 'single-movie_reviews.php' ) ) ) {
                $template_path = $theme_file;
            } else {
                $template_path = plugin_dir_path( __FILE__ ) . '/single-movie_reviews.php';
            }
        }
    }
    return $template_path;
}
3
Aidan Knight

Um eine benutzerdefinierte Vorlage in den Vorlagenbereich für Seitenattribute einzufügen, müssen Sie zuerst Ihre Vorlage zum Dropdown hinzufügen und in template_include hook laden, wenn die aktuelle Seite sie als aktuelle Vorlage ausgewählt hat.

/**
 * Add "Custom" template to page attirbute template section.
 */
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {

    // Add custom template named template-custom.php to select dropdown 
    $post_templates['template-custom.php'] = __('Custom');

    return $post_templates;
}

add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );


/**
 * Check if current page has our custom template. Try to load
 * template from theme directory and if not exist load it 
 * from root plugin directory.
 */
function wpse_288589_load_plugin_template( $template ) {

    if(  get_page_template_slug() === 'template-custom.php' ) {

        if ( $theme_file = locate_template( array( 'template-custom.php' ) ) ) {
            $template = $theme_file;
        } else {
            $template = plugin_dir_path( __FILE__ ) . 'template-custom.php';
        }
    }

    if($template == '') {
        throw new \Exception('No template found');
    }

    return $template;
}

add_filter( 'template_include', 'wpse_288589_load_plugin_template' );

theme_page_templates hook ist verfügbar für page post type. Wenn Sie eine benutzerdefinierte Vorlage zu einem anderen Beitragstyp hinzufügen möchten, müssen Sie page durch den Namen Ihres benutzerdefinierten Beitragstyps ersetzen, z. event post type hook hat einen Namen theme_event_templates.

5
kierzniak