web-dev-qa-db-fra.com

Pourquoi (et comment?) Get_header () efface-t-il toutes mes données?

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é:

  • Différents noms de constantes
  • Constantes de namespaced
  • Variables globales
  • Une fonction avec une variable statique

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?

1
Pekka 웃

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.

2
Jack Johansson

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 );
1
birgire