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>
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';
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.
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>
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.