web-dev-qa-db-fra.com

Vérifiez si un fichier partiel est appelé depuis header.php ou footer.php

J'inclus un fichier partiel à la fois dans header.php et dans footer.php avec get_template_part('content-form');

Existe-t-il une clause if que je peux utiliser pour vérifier à partir de quel endroit le fichier est appelé? S'il est appelé depuis footer.php, j'aimerais ajouter un nom de classe.

<div class="default-class <?php if (called_from_footer) echo 'footer-class'; ?>">
</div>

Je pourrais le faire et styler en conséquence s'il n'y avait pas de meilleure solution, je suis simplement curieux:

<div class=footer-container">
    <?php get_template_part('content-form') ;?>
</div>
6
Boris Kozarac

Ce n'est pas une solution vrai à votre problème (vérifier quel modèle en a chargé un autre), mais cela fonctionnera pour tester si le pied de page a été chargé ou non, et donc s'il charge votre partial

if ( did_action( 'get_footer' ) ) echo 'footer-class';
5
TheDeadMedic

Il existe de nombreuses bonnes solutions pour cela. Vous devez suivre le lien fourni par cjbj dans les commentaires.

Je suggère d'utiliser PHP debug_backtrace() function:

function wpse_228223_verify_caller_file( $file_name, $files = array(), $dir = '' ) {

    if( empty( $files ) ) {
        $files = debug_backtrace();
    }

    if( ! $dir ) {
        $dir = get_stylesheet_directory() . '/';
    }

    $dir = str_replace( "/", "\\", $dir );
    $caller_theme_file = array();

    foreach( $files as $file ) {
        if( false !== mb_strpos($file['file'], $dir) ) {
            $caller_theme_file[] = $file['file'];
        }
    }

    if( $file_name ) {
        return in_array( $dir . $file_name, $caller_theme_file );
    }

    return;

}

Usage:

Dans votre modèle content-form, passez le nom du fichier dans le premier paramètre:

echo var_dump( wpse_228223_verify_caller_file( 'header.php' ) ); // called from header
echo var_dump( wpse_228223_verify_caller_file( 'footer.php' ) ); // called from footer

et là, dans votre modèle, vous pouvez ajouter les noms de classe appropriés.

S'il vous plaît donner quelques tests d'abord. La façon dont j'ai testé cela a bien fonctionné. Puisque vous créez votre propre modèle personnalisé qui ne sera appelé par défaut que si vous l'appelez, cela devrait fonctionner correctement.

2
Samuel Elh

Honnêtement, je pense que la meilleure solution pour votre problème spécifique est la seule forme @TheDeadMedic .

C'est peut-être un peu "fragile" car do_action('get_footer') peut être fait dans n'importe quel fichier ... mais qu'est-ce qui n'est pas fragile dans WordPress?

Une autre solution, juste pour "un but académique" pourrait être d'utiliser PHP get_included_files() en vérifiant que footer.php était requis:

function themeFileRequired($file) {

    $paths = array(
        wp_normalize_path(get_stylesheet_directory().'/'.$file.'.php'),
        wp_normalize_path(get_template_directory().'/'.$file.'.php'),
    );

    $included = array_map('wp_normalize_path', get_included_files());

    $intersect = array_intersect($paths, $included);

    return ! empty($intersect);
}

Et alors:

<div class="default-class <?= if (themeFileRequired('footer') echo 'footer-class'; ?>">
</div>
2
gmazzap

Si vous voulez vraiment que tout soit rapide, utilisez simplement une variable globale (hé, WP le fait tout le temps, alors pourquoi pas vous?). Réglez-le avant l'appel et lisez-le après. Comme ça:

Dans functions.php: global $contentform_Origin = '';

Dans header.php: $contentform_Origin = 'header'; get_template_part('content-form');

Dans footer.php: $contentform_Origin = 'footer'; get_template_part('content-form');

Dans content-form.php: <div class="default-class <?php echo $contentform_Origin ?>-class"> </div>

N'oubliez pas de déclarer $contentform_Origin au début de chaque fichier php.

0
cjbj