Como mover arquivos de modelo de página como page- {slug} .php para um subdiretório?

10

Quero mover arquivos de modelo de página como page-{slug}.phppara um subdiretório dentro do meu tema, de forma que o WordPress os reconheça automaticamente. Se os modelos de página do formulário mencionado não existirem no subdiretório, o WordPress deverá retornar às regras de carregamento do modelo padrão. Como posso conseguir isso?

Nota 1: Esta pergunta e as respostas correspondentes são mais genéricas para os modelos de página e esse link menciona template-parts/page, o que não é a mesma coisa.

Nota-2: Eu tenho vários page-{slug}.phparquivos de modelo de página parecidos, então quero movê-los para o subdiretório para uma organização de arquivos mais organizada.

manifestador
fonte
2
Talvez valha a pena alterá-los para Modelos de página em vez de page-slug.php? Suportes centrais tendo modelos de página em um subdiretório: nacin.com/2012/03/29/...
WebElaine

Respostas:

12

Como os modelos de página são carregados:

De acordo com a Hierarquia de modelos do WordPress padrão , uma pagesolicitação carrega um modelo com base na prioridade e na nomeação, conforme indicado abaixo:

  1. Custom Page Template: se definido no editor de páginas.
  2. page-{slug}.php
  3. page-{url-encoded-slug}.php: somente para caracteres de vários bytes.
  4. page-{id}.php
  5. page.php
  6. singular.php
  7. index.php

Entre estes, singular.phpe na verdade nãoindex.php são modelos de página. é o modelo de fallback para qualquer tipo de postagem única e é o modelo de fallback final para qualquer coisa que um modelo do WordPress deva carregar. Portanto, os cinco primeiros são modelos de página.singular.phpindex.php

Como injetar arquivos de modelo de um subdiretório dentro da hierarquia:

A função principal do WordPress get_page_template()gera a pagematriz de hierarquia de modelos necessária e, pouco antes de decidir exatamente qual arquivo de modelo será carregado da hierarquia, o WordPress aciona o page_template_hierarchygancho de filtro. Portanto, a melhor maneira de adicionar um subdiretório, onde o WordPress procurará page-{slug}.phpmodelos automaticamente, é usar esse filtro e injetar nomes de arquivos adequados em relação a esse subdiretório na matriz de hierarquia de modelos de página.

Nota: o gancho de filtro original é um gancho de filtro dinâmico definido como{$type}_template_hierarchy, localizado nowp-includes/template.phparquivo. Então, quando$typeestiverpage, o gancho do filtro se tornarápage_template_hierarchy.

Agora, para nosso propósito, injetaremos o sub-directory/page-{slug}.phpnome do arquivo antes page-{slug}.phpda matriz de hierarquia de modelos passada para a função de retorno de chamada de hooks. Dessa forma, o WordPress carregará o sub-directory/page-{slug}.phparquivo, se existir, caso contrário, seguirá a hierarquia normal de carregamento do modelo de página. Obviamente, para manter a consistência, ainda daremos Custom Page Templateuma prioridade mais alta em comparação ao nosso sub-directory/page-{slug}.phparquivo. Portanto, a hierarquia de modelo de página modificada se tornará:

  1. Custom Page Template: se definido no editor de páginas.
  2. sub-directory/page-{slug}.php
  3. sub-directory/page-{url-encoded-slug}.php: somente para caracteres de vários bytes.
  4. page-{slug}.php
  5. page-{url-encoded-slug}.php: somente para caracteres de vários bytes.
  6. page-{id}.php
  7. page.php

functions.phpCÓDIGO de amostra :

Se você planeja fazer essa alteração apenas em um único tema, poderá usar o seguinte CÓDIGO no functions.phparquivo do seu tema ativo :

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

Exemplo de plug-in:

Se você deseja seguir a mesma organização de arquivos de modelo em vários temas, é melhor manter esse recurso separado do seu tema. Nesse caso, em vez de modificar o functions.phparquivo do tema com o código de amostra acima, você precisará criar um plug-in simples com o mesmo código de amostra.

Salve o seguinte código com um nome de arquivo, por exemplo, page-slug-template-subdir.phpdentro do pluginsdiretório do 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:

Com qualquer um dos códigos acima, o WordPress reconhecerá automaticamente os page-{slug}.phparquivos de modelo no page-templatesdiretório do seu tema.

Digamos, por exemplo, você tem uma aboutpágina. Portanto, se ele não tiver um custom page templateconjunto do editor, o WordPress procurará o THEME/page-templates/page-about.phparquivo de modelo e, se isso não existir, o WordPress procurará o THEME/page-about.phparquivo de modelo e assim por diante (por exemplo, a hierarquia padrão do modelo de página).

Fayaz
fonte