¿Cómo mover archivos de plantilla de página como page- {slug} .php a un subdirectorio?

10

Quiero mover archivos de plantilla de página como page-{slug}.phpa un subdirectorio dentro de mi tema, de manera que WordPress los reconozca automáticamente. Si las plantillas de página de dicho formulario no existen dentro del subdirectorio, entonces WordPress debería recurrir a las reglas predeterminadas de carga de plantillas. ¿Cómo puedo lograr eso?

Nota-1: Esta pregunta y las respuestas correspondientes son más genéricas para las plantillas de página y este enlace menciona template-parts/page, que no es lo mismo.

Nota-2: Tengo varios page-{slug}.phparchivos de plantillas de página similares, por lo que quiero moverlos al subdirectorio para una organización de archivos más ordenada.

manifestante
fuente
2
¿Quizás valdría la pena cambiarlos a Plantillas de página en lugar de page-slug.php? Core admite tener plantillas de página en un subdirectorio: nacin.com/2012/03/29/…
WebElaine

Respuestas:

12

Cómo se cargan las plantillas de página:

De acuerdo con la Jerarquía de plantillas de WordPress predeterminada , una pagesolicitud carga una plantilla basada en la prioridad y el nombre como se indica a continuación:

  1. Custom Page Template: si está definido en el editor de página.
  2. page-{slug}.php
  3. page-{url-encoded-slug}.php: solo para caracteres de varios bytes.
  4. page-{id}.php
  5. page.php
  6. singular.php
  7. index.php

Entre estos, singular.phpy en realidad noindex.php hay plantillas de página. es la plantilla de respaldo para cualquier tipo de publicación individual y es la plantilla de respaldo definitiva para cualquier cosa que se supone que cargue una plantilla de WordPress. Entonces, los primeros cinco son plantillas de página.singular.phpindex.php

Cómo inyectar archivos de plantilla desde un subdirectorio dentro de la jerarquía:

La función principal de WordPress get_page_template()genera la pagematriz de jerarquía de plantilla necesaria y, justo antes de decidir exactamente qué archivo de plantilla cargar desde la jerarquía, WordPress dispara el page_template_hierarchygancho de filtro. Entonces, la mejor manera de agregar un subdirectorio, donde WordPress buscará page-{slug}.phpplantillas automáticamente, es usar este filtro e inyectar nombres de archivo adecuados en relación con ese subdirectorio dentro de la matriz de jerarquía de plantillas de página.

Nota: el enlace de filtro original es un enlace de filtro dinámico definido como{$type}_template_hierarchy, que se encuentra en elwp-includes/template.phparchivo. Entonces, cuando$typeespage, el gancho del filtro se conviertepage_template_hierarchy.

Ahora, para nuestro propósito, inyectaremos el sub-directory/page-{slug}.phpnombre del archivo justo antes page-{slug}.phpdentro de la matriz de jerarquía de plantilla pasada a la función de devolución de llamada de ganchos. De esa manera, WordPress cargará el sub-directory/page-{slug}.phparchivo si existe, de lo contrario seguirá la jerarquía normal de carga de plantillas de página. Por supuesto, para mantener la coherencia, aún le daremos Custom Page Templateuna mayor prioridad en comparación con nuestro sub-directory/page-{slug}.phparchivo. Entonces la jerarquía de plantilla de página modificada se convertirá en:

  1. Custom Page Template: si está definido en el editor de página.
  2. sub-directory/page-{slug}.php
  3. sub-directory/page-{url-encoded-slug}.php: solo para caracteres de varios bytes.
  4. page-{slug}.php
  5. page-{url-encoded-slug}.php: solo para caracteres de varios bytes.
  6. page-{id}.php
  7. page.php

functions.phpCÓDIGO de muestra :

Si planea hacer este cambio solo en un solo tema, puede usar el siguiente CÓDIGO en el functions.phparchivo de su tema activo :

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

Plugin de muestra:

Si desea seguir la misma organización de archivos de plantilla en varios temas, lo mejor es mantener esta función separada de su tema. En ese caso, en lugar de modificar el functions.phparchivo del tema con el CÓDIGO de muestra anterior, deberá crear un complemento simple con el mismo CÓDIGO de muestra.

Guarde el siguiente CÓDIGO con un nombre de archivo, por ejemplo, page-slug-template-subdir.phpdentro de su pluginsdirectorio de 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' );

Uso:

Con cualquiera de los CÓDIGOS anteriores, WordPress reconocerá automáticamente los page-{slug}.phparchivos de plantilla dentro del page-templatesdirectorio de su tema.

Digamos, por ejemplo, que tienes una aboutpágina. Entonces, si no tiene un custom page templateconjunto del editor, entonces WordPress buscará el THEME/page-templates/page-about.phparchivo de plantilla y si eso no existe, entonces WordPress buscará el THEME/page-about.phparchivo de plantilla y así sucesivamente (es decir, la jerarquía de plantilla de página predeterminada).

Fayaz
fuente