Como os modelos de página são carregados:
De acordo com a Hierarquia de modelos do WordPress padrão , uma page
solicitação carrega um modelo com base na prioridade e na nomeação, conforme indicado abaixo:
Custom Page Template
: se definido no editor de páginas.
page-{slug}.php
page-{url-encoded-slug}.php
: somente para caracteres de vários bytes.
page-{id}.php
page.php
singular.php
index.php
Entre estes, singular.php
e 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.php
index.php
Como injetar arquivos de modelo de um subdiretório dentro da hierarquia:
A função principal do WordPress get_page_template()
gera a page
matriz 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_hierarchy
gancho de filtro. Portanto, a melhor maneira de adicionar um subdiretório, onde o WordPress procurará page-{slug}.php
modelos 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.php
arquivo. Então, quando$type
estiverpage
, o gancho do filtro se tornarápage_template_hierarchy
.
Agora, para nosso propósito, injetaremos o sub-directory/page-{slug}.php
nome do arquivo antes page-{slug}.php
da 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}.php
arquivo, 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 Template
uma prioridade mais alta em comparação ao nosso sub-directory/page-{slug}.php
arquivo. Portanto, a hierarquia de modelo de página modificada se tornará:
Custom Page Template
: se definido no editor de páginas.
sub-directory/page-{slug}.php
sub-directory/page-{url-encoded-slug}.php
: somente para caracteres de vários bytes.
page-{slug}.php
page-{url-encoded-slug}.php
: somente para caracteres de vários bytes.
page-{id}.php
page.php
functions.php
CÓDIGO de amostra :
Se você planeja fazer essa alteração apenas em um único tema, poderá usar o seguinte CÓDIGO no functions.php
arquivo 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.php
arquivo 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.php
dentro do plugins
diretó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}.php
arquivos de modelo no page-templates
diretório do seu tema.
Digamos, por exemplo, você tem uma about
página. Portanto, se ele não tiver um custom page template
conjunto do editor, o WordPress procurará o THEME/page-templates/page-about.php
arquivo de modelo e, se isso não existir, o WordPress procurará o THEME/page-about.php
arquivo de modelo e assim por diante (por exemplo, a hierarquia padrão do modelo de página).