web-dev-qa-db-fra.com

Existe-t-il un crochet ou une fonction que je peux utiliser pour afficher tous les fichiers de thème utilisés sur une page en cours?

En gros, je veux être capable de voir les noms de fichiers sur le front-end - pas seulement des modèles, par exemple. modèles de catégorie/page, mais les fichiers de thème réels tels que header.php/sidebar.php/footer.php, etc.

Donc, je pense que le problème est que ce que j'ai trouvé jusqu'à présent n'a pas la profondeur dont j'ai besoin et va seulement jusqu'à me dire quel "modèle" est utilisé par rapport à tous les éléments qui constituent le "modèle".

Je n'arrive pas à trouver quelque chose qui me donne un PHP objet var_dump et qui voit ce qui est disponible ou un crochet que je peux manipuler. Est-ce que cela existe réellement ou est-ce que je cherche des pailles?

Ce que j'ai examiné jusqu'à présent:

  • Comment trouvez-vous quel modèle sert la page actuelle?

    la réponse de t31os est utile, mais elle va aussi loin que le modèle de conteneur, donc si j'appelle sa fonction dans header.php, elle me dira page.php au lieu de header.php. En d'autres termes, je souhaite connaître le fichier exact à partir duquel ma fonction appelle.

  • Obtenir le nom du fichier de modèle actuel

    Il s’agit d’un problème similaire à celui de la première question et qui utilise toujours la réponse du t310 comme référence.

  • A également examiné la fonction wp_get_theme , mais cet objet ne me donne que des informations sur le thème lui-même, plutôt qu'un tableau ou une liste de fichiers.

Mon objectif est d’écrire une fonction qui répercuterait de manière dynamique sur tous les noms de fichiers ou éléments de ce qui est visualisé sur le serveur. Ainsi, une "page" pourrait faire écho à page.php, sidebar.php, footer.php et header.php par exemple.

S'il vous plaît pas de plugins, je voudrais résoudre ce problème avec PHP. Je comprends que ce n’est peut-être pas une réponse simple, mais je voudrais au moins un point de départ - ou du moins savoir si cela est possible.

5
RachieVee

PHP a une fonction, get_included_files() , qui renvoie tous les fichiers inclus lors d’une requête.

Cependant, si vous utilisez cette fonction, vous obtenezallles fichiers requis: fichiers de base WordPress, fichiers de plug-in ...

Vous avez besoin d'un moyen de:

  • Filtrer les fichiers qui n'appartiennent pas au thème et au thème enfant (le cas échéant)
  • Inclure uniquement les fichiers chargés après le modèle principal a été inclus

Vous devez également appeler cette fonction le plus tard possible. shutdown serait le meilleur hook, cependant, wp_footer devrait aller, car il est rare que vous incluiez un fichier après le déclenchement de ce hook.

En ce qui concerne les 2 problèmes mentionnés ci-dessus, le premier peut être résolu en filtrant le tableau pour les fichiers qui appartiennent uniquement au dossier du thème.

La seconde peut être résolue en utilisant template_include , avec une priorité très faible, pour enregistrer le chemin du modèle principal, puis en n'incluant dans la sortie que les fichiers inclus.

Voici une classe qui implémente ce qui est dit ci-dessus. Mettre dans un fichier et demander à functions.php:

class IncludedPartGrabber
{    
    private $main;
    private $root;
    private $switch = false;

    public function setup( $template )
    {
        $this->root = wp_normalize_path( get_theme_root() ); // theme folder
        $this->main = wp_normalize_path( $template ); // main template

        return $template;
    }

    public function grab()
    {
        return array_filter( get_included_files(), array( $this, 'filter' ) );
    }

    private function filter( $file )
    {
        $norm =  wp_normalize_path( $file );
        if ( $norm === $this->main )
            $this->switch = TRUE; // after main template all files are good to be included

        return $this->switch && strpos( $norm, $this->root ) === 0; // true if file is in theme dir
    }
}

Utilisez-le comme ça, dans votre functions.php:

$grabber = new IncludedPartGrabber;

add_action( 'template_include', array( $grabber, 'setup' ) );

add_action( 'wp_footer', function() use($grabber) {
    echo '<pre>';
    print_r( $grabber->grab() ); // see your footer :)
    echo '</pre>';
} );

Si vous souhaitez utiliser un fichier de modèle, dans functions.php, mettez:

global $grabber;
$grabber = new IncludedPartGrabber;

add_action( 'template_include', array( $grabber, 'setup' ) );

puis dans le fichier de modèle, par exemple. footer.php:

<pre><?php print_r( $GLOBALS['grabber']->grab() ); ?></pre>

Bien sûr, vous pouvez aussi utiliser header.php, mais à partir de ce fichier, seuls les fichiers chargés au moment où header.php a été inclus, par exemple. page.php et header.php. PHP est un langage de programmation, pas une machine magique, et ne peut pas savoir quels fichiers vont être inclus avant ils sont réellement inclus.

7
gmazzap

get_header, get_footer et get_sidebar ont tous des actions correspondantes qui transmettent le nom en tant qu'argument. Vous pouvez donc les lier, en vérifier l'existence via locate_template et enregistrer les noms.

get_template_part a une action, mais elle est dynamique et inclut la limace. Si vous ne connaissez pas les limaces, il sera difficile de les accrocher. ce que vous pouvez faire, c'est hook all, et string correspond à la première partie de l'action, get_template_part_, qui correspond exactement à à quoi sert ce que le plugin File fait :

add_action( 'all', 'save_template_parts', 1, 3 );

function save_template_parts( $tag, $slug = null, $name = null ) {
    if ( 0 !== strpos( $tag, 'get_template_part_' ) ) {
        return;
    }

    // Check if slug is set
    if ( $slug != null ) {

        // Templates array
        $templates = array();

        // Add possible template part to array
        if ( $name != null ) {
            $templates[] = "{$slug}-{$name}.php";
        }

        // Add possible template part to array
        $templates[] = "{$slug}.php";

        // Get the correct template part
        $template_part = str_replace( get_template_directory() . '/', '', locate_template( $templates ) );
        $template_part = str_replace( get_stylesheet_directory() . '/', '', $template_part );

        // Add template part if found
        if ( $template_part != '' ) {
            // log $template_part
        }
    }

}
3
Milo

Joue avec:

echo '<ul><li>'.implode('</li><li>', str_replace(str_replace('\\', '/', ABSPATH).'wp-content/', '', array_slice(str_replace('\\', '/', get_included_files()), (array_search(str_replace('\\', '/', ABSPATH).'wp-includes/template-loader.php', str_replace('\\', '/', get_included_files())) + 1)))).'</li></ul>';

Liste HTML contenant tous les fichiers de modèle utilisés pour la page d'arrivée actuelle, y compris toutes les parties de modèle de plug-ins, de thème enfant et/ou de combinaison de thème parent, le tout dans une seule ligne de code.

Écrit à:

Comment trouvez-vous quelle page de modèle sert la page actuelle?

si admin-bar stuff chemin est affiché en haut, ou dans tout autre fichier, remplacez le nom de fichier template-loader.php par cette ligne de code par: quel que soit le nom de fichier que vous souhaitez interrompre.

si vous en avez besoin dans la barre d’administration,utilisez la bonne propriété(au plus tôt)pour vous assurer que aucun fichier n’est entré à la fin de la listede cette liste. Par exemple:

add_action('admin_bar_menu', 'my_adminbar_template_monitor', -5);

priority -5 make shure il se charge en premier. La clé est de rendre cette ligne au bon moment.

Faites quelques changements si votre serveur utilise des barres obliques doubles.

0
Jonas Lundman