J'ai un page.php
dans lequel je définis un sous-menu personnalisé à transmettre à header.php
.
J'ai essayé d'utiliser une constante (maladroite, je sais):
define("CUSTOM_MENU", "<ul><li>Test</li></ul>");
juste après cela, le code inclut l'en-tête:
get_header();
Dans le fichier header.php, où se trouve le sous-menu, je produis en sortie soit le sous-menu personnalisé (si défini), soit un wp_nav_menu
:
if (defined("CUSTOM_MENU"))
echo constant("CUSTOM_MENU");
else
wp_nav_menu(array(some stuff));
bizarrement, la constante CUSTOM_MENU
devient vide dès que la fonction get_header()
est appelée - et reste vide pour le reste de page.php
:
define("CUSTOM_MENU", "<ul><li>Test</li></ul>");
echo constant("CUSTOM_MENU"); // The HTML code above
get_header();
echo constant("CUSTOM_MENU"); // Null!
Cela se produit pour toute méthode permettant de stocker les données de menu personnalisées que j'utilise. J'ai essayé:
Je ne comprends pas pourquoi cela arriverait! Si get_header()
incluait en quelque sorte header.php à l'aide de l'encapsuleur http, la valeur ne serait pas annulée une fois que nous aurions quitté get_header()
.
Qu'est-ce qui se passe ici? Est-ce que je néglige quelque chose d'évident?
Il y a probablement un problème d'ordre de chargement. La fonction get_header()
inclut votre fichier header.php
, donc je ne suis pas sûr de ce qui se passe à l'intérieur de ce modèle. Une solution consiste à l'inclure à l'aide de include()
et à vérifier si le comportement est identique.
Je vous suggère de vous connecter au wp_head
ou au init
et de définir votre constante là-bas.
add_action('init', 'define_my_constant' );
function define_my_constant() {
if ( ! defined( 'CUSTOM_MENU' ) && is_page() ) {
define('CUSTOM_MENU', '<ul><li>Test</li></ul>');
}
}
init
est l’un des premiers hooks fonctionnant sur WordPress; votre constante doit donc être accessible dans n’importe quel thème ou plug-in à ce stade.
Vous pouvez essayer de court-circuiter la wp_nav_menu()
avec ce filtre, pour un theme_location
donné, sur des pages données:
/**
* Filters whether to short-circuit the wp_nav_menu() output.
*
* Returning a non-null value to the filter will short-circuit
* wp_nav_menu(), echoing that value if $args->echo is true,
* returning that value otherwise.
*
* @since 3.9.0
*
* @see wp_nav_menu()
*
* @param string|null $output Nav menu output to short-circuit with. Default null.
* @param stdClass $args An object containing wp_nav_menu() arguments.
*/
$nav_menu = apply_filters( 'pre_wp_nav_menu', null, $args );
Exemple:
Ici, nous remplaçons la sortie du menu de navigation, à l'emplacement du thème primary
, pour la page test
:
add_filter( 'pre_wp_nav_menu', function( $nav_menu, $args )
{
if ( 'primary' !== $args->theme_location )
return $nav_menu;
if( is_page( 'test' ) )
$nav_menu = '<ul><li>Test</li></ul>';
return $nav_menu;
}, 10, 2 );