Come spostare i file modello di pagina come page- {slug} .php in una sottodirectory?


10

Voglio spostare i file modello di pagina come page-{slug}.phpin una sottodirectory all'interno del mio tema, in modo che WordPress li riconoscerà automaticamente. Se i modelli di pagina di tale modulo non esistono all'interno della sottodirectory, WordPress dovrebbe ricorrere alle regole di caricamento dei modelli predefiniti. Come posso raggiungerlo?

Nota 1: questa domanda e le risposte corrispondenti sono più generiche per i modelli di pagina e questo link menziona template-parts/page, che non è la stessa cosa.

Nota-2: ho molti page-{slug}.phpfile modello di pagina simili, quindi voglio spostarli nella sottodirectory per un'organizzazione di file più ordinata.


2
Forse varrebbe la pena cambiarli in Modelli di pagina anziché in page-slug.php? Core supporta avere modelli di pagina in una sottodirectory: nacin.com/2012/03/29/…
WebElaine

Risposte:


12

Come vengono caricati i modelli di pagina:

Secondo la Gerarchia dei modelli di WordPress predefinita , una pagerichiesta carica un modello in base alla priorità e alla denominazione come indicato di seguito:

  1. Custom Page Template: se definito nell'editor di pagine.
  2. page-{slug}.php
  3. page-{url-encoded-slug}.php: solo per caratteri multibyte.
  4. page-{id}.php
  5. page.php
  6. singular.php
  7. index.php

Tra questi, singular.phpe in realtà nonindex.php sono modelli di pagina. è il modello di fallback per ogni singolo tipo di post ed è il modello di fallback definitivo per tutto ciò che un modello di WordPress dovrebbe caricare. Quindi i primi cinque sono modelli di pagina.singular.phpindex.php

Come iniettare file modello da una sottodirectory all'interno della gerarchia:

La funzione principale di WordPress get_page_template()genera l' pagearray gerarchico di template necessario e poco prima di decidere esattamente quale file template caricare dalla gerarchia, WordPress attiva l' page_template_hierarchyhook del filtro. Quindi il modo migliore per aggiungere una sottodirectory, in cui WordPress cercherà page-{slug}.phpautomaticamente i modelli, è utilizzare questo filtro e iniettare i nomi di file appropriati relativi a quella sottodirectory all'interno dell'array gerarchico dei modelli di pagina.

Nota: l'hook filtro originale è un hook di filtro dinamico definito come{$type}_template_hierarchy, che si trova nelwp-includes/template.phpfile. Quindi, quando lo$typeèpage, il gancio del filtro diventapage_template_hierarchy.

Ora, per il nostro scopo, inietteremo il sub-directory/page-{slug}.phpnome del file poco prima page-{slug}.phpall'interno dell'array della gerarchia dei modelli passato alla funzione di callback degli hook. In questo modo, WordPress caricherà il sub-directory/page-{slug}.phpfile se esiste, altrimenti seguirà la normale gerarchia di caricamento del modello di pagina. Naturalmente, per mantenere la coerenza, daremo comunque Custom Page Templateuna priorità più alta rispetto al nostro sub-directory/page-{slug}.phpfile. Quindi la gerarchia del modello di pagina modificata diventerà:

  1. Custom Page Template: se definito nell'editor di pagine.
  2. sub-directory/page-{slug}.php
  3. sub-directory/page-{url-encoded-slug}.php: solo per caratteri multibyte.
  4. page-{slug}.php
  5. page-{url-encoded-slug}.php: solo per caratteri multibyte.
  6. page-{id}.php
  7. page.php

functions.phpCODICE di esempio :

Se prevedi di apportare questa modifica solo su un singolo tema, puoi utilizzare il seguente CODICE nel functions.phpfile del tema attivo :

// 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 di esempio:

Se vuoi seguire la stessa organizzazione di file modello in più temi, allora è meglio mantenere questa funzione separata dal tuo tema. In tal caso, invece di modificare il functions.phpfile del tema con il CODICE di esempio sopra riportato, dovrai creare un semplice plugin con lo stesso CODICE di esempio.

Salvare il seguente CODICE con un nome file, ad es. Nella directory di page-slug-template-subdir.phpWordPress plugins:

<?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 uno dei codici sopra indicati, WordPress riconoscerà automaticamente i page-{slug}.phpfile modello all'interno della page-templatesdirectory del tema.

Ad esempio, hai una aboutpagina. Quindi, se non ha un custom page templateset dall'editor, WordPress cercherà il THEME/page-templates/page-about.phpfile modello e se ciò non esiste, WordPress cercherà il THEME/page-about.phpfile modello e così via (cioè la gerarchia predefinita del modello di pagina).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.