web-dev-qa-db-fra.com

Comment déplacer des modèles de page dans un dossier personnalisé?

J'ai créé des modèles de page utilisant le slug de page, par exemple, page-contact.php, page-gallery.php, etc. ou l'identifiant de page, par exemple, page-2.php, page-11.php, etc.

Comment puis-je déplacer ces modèles vers un sous-dossier, par exemple /mytheme/pages/?

5
Den

/ YOUR_THEME/page-templates/ne fonctionnera que pour les modèles de page personnalisés attribués sur l'écran d'édition de la page d'administration, pas pour les modèles de page- $ slug ou page- $ id.

À mon avis, le crochet de filtre correct est page_template, mais vous ne voulez pas (je suppose!) Jeter d'autres modèles possibles pour vos pages, notamment parce que vous avez forcément certaines pages sur votre site pour lesquelles vous n'avez ne créez pas un fichier modèle /my-sub-dir/page-$slug.php.

Le crochet de filtre page_template est appelé juste après que WP ait trouvé un modèle pour la page à l'aide de la hiérarchie des modèles standard. Il serait pratique s'il existait un filtre vous permettant d'injecter votre modèle supplémentaire dans la partie droite de la hiérarchie des modèles, mais en l'absence de cela, nous devrons répliquer la recherche de modèles de page à partir de la fonction get_page_template () de WordPress, trouvé dans /wp-includes/template.php:

function get_page_template() {
    $id = get_queried_object_id();
    $template = get_page_template_slug();
    $pagename = get_query_var('pagename');

    if ( ! $pagename && $id ) {
        // If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object
        $post = get_queried_object();
        if ( $post )
            $pagename = $post->post_name;
    }

    $templates = array();
    if ( $template && 0 === validate_file( $template ) )
        $templates[] = $template;
    if ( $pagename )
        $templates[] = "page-$pagename.php";
    if ( $id )
        $templates[] = "page-$id.php";
    $templates[] = 'page.php';

    return get_query_template( 'page', $templates );
}

Cette fonction crée un tableau de modèles possibles pour Pages. get_query_template () utilise ensuite locale_template () pour parcourir le tableau et renvoyer le nom de fichier du premier modèle trouvé.

Comme nous ne pouvons pas nous attacher à la liste des modèles proposés, nous devrons malheureusement dupliquer une partie de ce travail.

Voici notre propre fonction:

function tbdn_get_page_template() {
    $id = get_queried_object_id();
    $template = get_page_template_slug();
    $pagename = get_query_var('pagename');

    if ( ! $pagename && $id ) {
        // If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object
        $post = get_queried_object();
        if ( $post )
            $pagename = $post->post_name;
    }

    $templates = array();

    if ( $template && 0 === validate_file( $template ) )
        $templates[] = $template;
    // if there's a custom template then still give that priority

    if ( $pagename )
        $templates[] = "our-sub-dir/page-$pagename.php";
    // change the default search for the page-$slug template to use our directory
    // you could also look in the theme root directory either before or after this

    if ( $id )
        $templates[] = "our-sub-dir/page-$id.php";
    $templates[] = 'page.php';

    /* Don't call get_query_template again!!!
       // return get_query_template( 'page', $templates );
       We also reproduce the key code of get_query_template() - we don't want to call it or we'll get stuck in a loop .
       We can remove lines of code that we know won't apply for pages, leaving us with...
    */

    $template = locate_template( $templates );

    return $template;
}

add_filter( 'page_template', 'tbdn_get_page_template' );

Mises en garde:

1 - Je n’ai pas testé cela, mais si vous êtes prêt à jouer avec la hiérarchie des modèles, vous devriez certainement pouvoir suivre, tester et ajuster mon code, qui est généralement copié à partir de WP de toute façon.

2 - Si le code principal futur modifie la hiérarchie du modèle pour les pages, le code ci-dessus deviendra obsolète.

4

J'ai posté les détails sur cette réponse . Ici, le CODE est ajusté en fonction de deux différences spécifiques de cette question:

  1. Déplacez les modèles de page dans un sous-répertoire sans faire de retour en arrière. Par exemple, il va vérifier THEME/sub-directory/page-{slug}.php, mais il va pas vérifier THEME/page-{slug}.php, parce que c'est ce que l'OP a demandé. Cependant, l'option avec repli dans l'autre réponse est préférable, surtout dans le cas d'un thème enfant (le thème parent pouvant dépendre du repli).

  2. Cela va déplacer page-{slug}.php et page-{id}.php dans le sous-répertoire.


Crochet de filtre à utiliser:

Le meilleur moyen de déplacer les modèles de page dans un sous-répertoire, par exemple /THEME/page-templates/, consiste à utiliser le crochet de filtre page_template_hierarchy.

Remarque: le crochet de filtre d'origine est {$ type} _template_hierarchy, qui devient page_template_hierarchy lorsque $type est page.

Exemple de code:

<?php
/*
Plugin Name:  WPSE Page Template move to Sub Directory
Plugin URI:   https://wordpress.stackexchange.com/a/227006/110572
Description:  WPSE Page Template move to a Sub Directory
Version:      1.0.0
Author:       Fayaz Ahmed
Author URI:   https://www.fayazmiraz.com/
*/

// defining the sub-directory so that it can be easily accessed from elsewhere as well.
define( 'WPSE_PAGE_TEMPLATE_SUB_DIR', 'page-templates' );

function wpse227006_page_template_add_subdir( $templates = array() ) {
    // Generally this doesn't happen, unless another plugin / theme does modifications
    // of their own. In that case, it's better not to mess with it again with our code.
    if( empty( $templates ) || ! is_array( $templates ) || count( $templates ) < 3 )
        return $templates;

    $page_tpl_idx = 0;
    $cnt = count( $templates );
    if( $templates[0] === get_page_template_slug() ) {
        // if there is custom template, then our page-{slug}.php template is at the next index 
        $page_tpl_idx = 1;
    }

    // the last one in $templates is page.php, so
    // all but the last one in $templates starting from $page_tpl_idx will be moved to sub-directory
    for( $i = $page_tpl_idx; $i < $cnt - 1; $i++ ) {
        $templates[$i] = WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$i];
    }

    return $templates;
}
// the original filter hook is {$type}_template_hierarchy,
// wihch is located in wp-includes/template.php file
add_filter( 'page_template_hierarchy', 'wpse227006_page_template_add_subdir' );
1
Fayaz

WordPress reconnaîtra les fichiers modèles dans/YOUR_THEME/page-templates /: https://developer.wordpress.org/themes/basics/organizing-theme-files/#page-templates-folder

0