Comment déplacer des fichiers de modèle de page comme page- {slug} .php vers un sous-répertoire?

10

Je souhaite déplacer les fichiers de modèle de page comme page-{slug}.phpvers un sous-répertoire de mon thème, de manière à ce que WordPress les reconnaisse automatiquement. Si les modèles de page dudit formulaire n'existent pas dans le sous-répertoire, alors WordPress devrait revenir aux règles de chargement des modèles par défaut. Comment puis-je y parvenir?

Note-1: Cette question et les réponses correspondantes sont plus génériques pour les modèles de page et ce lien mentionne template-parts/page, ce qui n'est pas la même chose.

Note-2: J'ai plusieurs page-{slug}.phpfichiers de modèle de page similaires, donc je veux les déplacer vers un sous-répertoire pour une organisation des fichiers plus ordonnée.

manifestant
la source
2
Peut-être vaudrait-il la peine de les changer en modèles de page au lieu de page-slug.php? Le noyau prend en charge la présence de modèles de page dans un sous-répertoire: nacin.com/2012/03/29/…
WebElaine

Réponses:

12

Comment les modèles de page sont chargés:

Selon la hiérarchie de modèles WordPress par défaut , une pagedemande charge un modèle en fonction de la priorité et du nom, comme indiqué ci-dessous:

  1. Custom Page Template: si défini dans l'éditeur de page.
  2. page-{slug}.php
  3. page-{url-encoded-slug}.php: uniquement pour les caractères multi-octets.
  4. page-{id}.php
  5. page.php
  6. singular.php
  7. index.php

Parmi ceux-ci, singular.phpet neindex.php sont pas réellement des modèles de page. singular.phpest le modèle de secours pour tous les types de publication et index.phple modèle de secours ultime pour tout ce qu'un modèle WordPress est censé charger. Les cinq premiers sont donc des modèles de page.

Comment injecter des fichiers de modèle à partir d'un sous-répertoire de la hiérarchie:

La fonction principale de WordPress get_page_template()génère le pagetableau de hiérarchie de modèles nécessaire et juste avant de décider exactement quel fichier de modèle à charger à partir de la hiérarchie, WordPress déclenche le page_template_hierarchycrochet du filtre. Donc, la meilleure façon d'ajouter un sous-répertoire, où WordPress recherchera page-{slug}.phpautomatiquement les modèles, est d'utiliser ce filtre et d'injecter les noms de fichiers appropriés par rapport à ce sous-répertoire dans le tableau de hiérarchie des modèles de page.

Remarque: le crochet de filtre d'origine est un crochet de filtre dynamique défini comme{$type}_template_hierarchy, qui se trouve dans lewp-includes/template.phpfichier. Ainsi, lorsque le$typeestpage, le crochet du filtre devientpage_template_hierarchy.

Maintenant, pour notre objectif, nous allons injecter le sub-directory/page-{slug}.phpnom de fichier juste avant page-{slug}.phpdans le tableau de hiérarchie de modèles passé à la fonction de rappel des hooks. De cette façon, WordPress chargera le sub-directory/page-{slug}.phpfichier s'il existe, sinon il suivra la hiérarchie de chargement de modèle de page normale. Bien sûr, pour maintenir la cohérence, nous donnerons toujours Custom Page Templateune priorité plus élevée par rapport à notre sub-directory/page-{slug}.phpfichier. Ainsi, la hiérarchie de modèle de page modifiée deviendra:

  1. Custom Page Template: si défini dans l'éditeur de page.
  2. sub-directory/page-{slug}.php
  3. sub-directory/page-{url-encoded-slug}.php: uniquement pour les caractères multi-octets.
  4. page-{slug}.php
  5. page-{url-encoded-slug}.php: uniquement pour les caractères multi-octets.
  6. page-{id}.php
  7. page.php

Exemple de functions.phpCODE:

Si vous prévoyez d'effectuer cette modification uniquement sur un seul thème, vous pouvez utiliser le CODE suivant dans le functions.phpfichier de votre thème actif :

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

function wpse312159_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;
    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;
    }

    $page_tpls = array( WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx] );

    // As of WordPress 4.7, the URL decoded page-{$slug}.php template file is included in the
    // page template hierarchy just before the URL encoded page-{$slug}.php template file.
    // Also, WordPress always keeps the page id different from page slug. So page-{slug}.php will
    // always be different from page-{id}.php, even if you try to input the {id} as {slug}.
    // So this check will work for WordPress versions prior to 4.7 as well.
    if( $templates[$page_tpl_idx] === urldecode( $templates[$page_tpl_idx + 1] ) ) {
        $page_tpls[] = WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx + 1];
    }

    array_splice( $templates, $page_tpl_idx, 0, $page_tpls );

    return $templates;
}
add_filter( 'page_template_hierarchy', 'wpse312159_page_template_add_subdir' );

Exemple de plugin:

Si vous souhaitez suivre la même organisation de fichiers de modèle dans plusieurs thèmes, il est préférable de garder cette fonctionnalité distincte de votre thème. Dans ce cas, au lieu de modifier le functions.phpfichier du thème avec l'exemple de CODE ci-dessus, vous devrez créer un plugin simple avec le même exemple de CODE.

Enregistrez le CODE suivant avec un nom de fichier, par exemple page-slug-template-subdir.phpdans votre pluginsrépertoire WordPress :

<?php
/*
Plugin Name:  WPSE Page Template page-slug.php to Sub Directory
Plugin URI:   https://wordpress.stackexchange.com/a/312159/110572
Description:  Page Template with page-{slug}.php 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 wpse312159_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;
    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;
    }

    $page_tpls = array( WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx] );
                                                                                  uded in the
    // page template hierarchy just before the URL encoded page-{$slug}.php template file.
    // Also, WordPress always keeps the page id different from page slug. So page-{slug}.php will
    // always be different from page-{id}.php, even if you try to input the {id} as {slug}.
    // So this check will work for WordPress versions prior to 4.7 as well.
    if( $templates[$page_tpl_idx] === urldecode( $templates[$page_tpl_idx + 1] ) ) {
        $page_tpls[] = WPSE_PAGE_TEMPLATE_SUB_DIR . '/' . $templates[$page_tpl_idx + 1];
    }

    array_splice( $templates, $page_tpl_idx, 0, $page_tpls );

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

Usage:

Avec l'un des codes ci-dessus, WordPress reconnaîtra automatiquement page-{slug}.phples fichiers de modèle dans le page-templatesrépertoire de votre thème.

Disons par exemple que vous avez une aboutpage. Donc, s'il n'a pas de custom page templatejeu depuis l'éditeur, WordPress recherchera le THEME/page-templates/page-about.phpfichier de modèle et s'il n'existe pas, WordPress recherchera le THEME/page-about.phpfichier de modèle et ainsi de suite (c'est-à-dire la hiérarchie de modèle de page par défaut).

Fayaz
la source