web-dev-qa-db-fra.com

Le menu principal n'apparaît pas sur les pages de catégorie

Je crée un thème basé sur blankslate/Bootstrap et j'ai un problème avec la navigation principale apparaissant sur les pages de catégories (semble apparaître partout ailleurs ok.).

Dans header.php:

<div class="collapse navbar-collapse" id="navbar-collapse-1">
                      <?php
                      wp_nav_menu( array(
                      'menu'              => 'primary',
                      'theme_location'    => 'primary',
                      'depth'             => 2,
                      'menu_class'        => 'nav navbar-nav',
                      'fallback_cb'       => 'wp_bootstrap_navwalker::fallback',
                      'walker'            => new wp_bootstrap_navwalker())
                      );
                      ?>

Dans Functions.php

// Register Custom Navigation Walker
require_once('wp_bootstrap_navwalker.php');
register_nav_menus( array(
'primary' => __( 'Primary Menu', 'themename' ),
) );

Toute aide ou pointeur serait apprécié

4
Pilgrimiv

Je sais que cette question est assez ancienne, mais comme il n’ya pas encore de réponse et qu’il existe de nombreuses questions similaires sur les forums d’assistance WordPress, je ferai mieux de partager mes découvertes et d’aider peut-être quelqu'un.

Le problème de la disparition du menu peut être dû à un code inséré dans le plugin ou au thème qui modifie de manière incorrecte l’objet $wp_query global à l’aide du crochet de filtre pre_get_posts.

J'ai découvert que le code à l'origine des problèmes était dans le thème:

function namespace_add_custom_types( $query ) {
  if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) {

    $query->set( 'post_type', array(
                'post',
                'projects',
            ));
        return $query;
    }
}
add_filter( 'pre_get_posts', 'namespace_add_custom_types' );

Cet extrait de code est censé ajouter des types de publication personnalisés aux archives de catégorie, mais il a également affecté la requête dans wp_nav_menu.

Pour résoudre le problème, je devais corriger la condition if:

function namespace_add_custom_types( $query ) {
  if( is_archive() && (is_category() || is_tag()) && empty( $query->query_vars['suppress_filters'] ) ) {

    $query->set( 'post_type', array(
                'post',
                'projects',
            ));
        return $query;
    }
}
add_filter( 'pre_get_posts', 'namespace_add_custom_types' );

YMMV et la cause pourraient être entièrement différents, mais voici comment j'ai résolu le problème du menu manquant dans le modèle de catégorie.

7
AndyDeGroo

Pour moi

    if ($q->get('post_type') != 'post') {
        return;
    }

dans le gestionnaire de pre_get_posts corrigé.

1
Alex

J'ai eu le même problème parce que j'ajoutais le filtre pre_get_posts et qu'il me manquait pour passer l'élément de menu à la publication. Voici comment j'ai résolu:

Auparavant, ce code était présent dans le functions.php de mon thème et je remplaçais la requête principale par le $post_type uniquement, sans passer par les éléments de menu, et le menu n'apparaissait pas:

add_filter( 'pre_get_posts', 'query_post_type' );
function query_post_type( $query ) {
    if ( is_category() ) {
        $post_type = get_query_var( 'post_type' );
        if ( $post_type ) {
            $post_type = $post_type;
        } else {
            $post_type = array( 'nav_menu_item', 'post', 'departments' );
        }
        $query->set( 'post_type', $post_type );

        return $query;
    }
}

Et j'ai résolu en passant le 'nav_menu_item' comme suit:

add_filter( 'pre_get_posts', 'query_post_type' );
function query_post_type( $query ) {
    if ( is_category() ) {
        $post_type = get_query_var( 'post_type' );
        if ( $post_type ) {
            $post_type = array( 'nav_menu_item', $post_type );
        } else {
            $post_type = array( 'nav_menu_item', 'post', 'departments' );
        }
        $query->set( 'post_type', $post_type );

        return $query;
    }
}
0
Adriana Hernández