web-dev-qa-db-fra.com

Chargement de fichiers de modèle depuis un sous-dossier de mon thème?

Je travaille sur un site qui contiendra jusqu'à 30 modèles.

Je ne veux pas que tous ces modèles à la racine de mon dossier de thèmes encombrent tout.

Je sais comment je peux modifier la fonction get_page_templates() dans le fichier wp-admin/includes/theme.php pour lui faire analyser les sous-répertoires de mon dossier de thèmes. Mais je ne veux pas modifier manuellement les fichiers de base - comment puis-je appliquer un filtre à get_page_templates() avec un filtre que je mets dans functions.php?

Comme le code que vous voyez ci-dessous est ma première tentative, mais cela ne fonctionne pas encore lorsque je mets le code dans function.php.

Je peux toutefois mettre ces modifications dans le fichier de base wp-admin/includes/theme.php, mais ce n’est pas une bonne pratique et doit toujours être évité, car la mise à jour automatique peut l’effacer.

function get_page_templates_override() 
{
$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];
$page_templates = array();

if ( is_array( $templates ) ) {
    $base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );

    foreach ( $templates as $template ) {
        $basename = str_replace($base, '', $template);

        // modifide this by commenting it out so that sub dirs arent blocked
        // if ( false !== strpos($basename, '/') )
        //  continue;

        // modified this with FILE_USE_INCLUDE_PATH so sub dirs get scanned
        $template_data = implode( '', file( $template, FILE_USE_INCLUDE_PATH ));

        $name = '';
        if ( preg_match( '|Template Name:(.*)$|mi', $template_data, $name ) )
            $name = _cleanup_header_comment($name[1]);

        if ( !empty( $name ) ) {
            $page_templates[trim( $name )] = $basename;
        }
    }
}
return $page_templates;
}
add_filter('get_page_templates','get_page_templates_override', 1);
4
MrStack

Cette partie est extrêmement rigide, consultez cette question sur le chargement de modèles de page à partir du répertoire du plugin .

Avec l'état actuel du code associé, je ne prendrais pas la peine d'y consacrer du temps. Surtout que vous le voulez pour votre commodité (mettre le modèle dans des sous-répertoires) et non pour des fonctionnalités (comme le chargement depuis le dossier du plugin).

2
Rarst

Il y a quelques billets à ce sujet: # 13265 et # 11216 .

En outre, il semble moins encombré si vous préfixez chaque modèle avec une chaîne fixe:

template-a.php
template-b.php

etc.

1
scribu

Il est à noter qu’à partir de WP 3.4 (il y a presque un an), il est maintenant possible de placer les fichiers de modèle dans un répertoire situé sous la racine du thème. WordPress les détectera et les utilisera au besoin.

Selon http://nacin.com/2012/03/29/page-templates-in-subdirectories-new-in-wordpress-3-4/ .

0
Grant Palin