web-dev-qa-db-fra.com

Chargement du modèle de page personnalisé via un plugin

Je suis un didacticiel plutôt obsolète sur les types de publication personnalisés. La dernière étape consiste à créer un modèle de page personnalisé, dans le but de montrer toutes les publications du type personnalisé au format liste d'archives. Selon les commentaires, les méthodes utilisées ne fonctionnent plus 6 ans plus tard (voir figure) et mon modèle de page personnalisé n'est pas une option lors de la création d'une nouvelle page.

Si je place mon modèle personnalisé dans le dossier du thème, cela fonctionne, mais l'option de le charger à partir du répertoire du plugin est brisée. Comment puis-je résoudre ce problème afin d'attribuer le modèle à une nouvelle page?

Modifier

Comme je comprends mieux maintenant, ce code est seulement _ charger le modèle lors de l'affichage de mes types d'articles personnalisés. La confusion était due au fait qu'il apparaisse comme un modèle disponible dans la section "Attributs de page" lorsqu'il se trouvait dans le répertoire Thèmes. Je souhaite qu'il soit disponible en option lors de la création d'une nouvelle page, mais que le fichier de modèle se trouve dans le répertoire de mon plugin.

Le code original du tutoriel:

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

Pour ajouter un modèle personnalisé dans la section des modèles d'attributs de page, vous devez d'abord ajouter votre modèle au menu déroulant, puis le charger dans le crochet template_include lorsque la page actuelle l'a sélectionné comme modèle actuel.

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

Le hook theme_page_templates est disponible pour le type de message page. Si vous souhaitez ajouter un modèle personnalisé à un autre type de publication, vous devez remplacer page par votre nom de type de publication personnalisé, par exemple. event post type hook aura un nom theme_event_templates.

5
kierzniak