web-dev-qa-db-ja.com

メインページがカテゴリページに表示されない

Blankslate/Bootstrapに基づいてテーマを作成し、カテゴリページにメインナビゲーションが表示されるという問題があります(他の場所には表示されるようです)。

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())
                      );
                      ?>

Functions.php内

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

任意の助けやポインタをいただければ幸いです

4
Pilgrimiv

私はこの質問はかなり古くからあると知っていますが、まだ答えがないので、WordPressサポートフォーラムに同様の質問がたくさんあるので、私は自分の調査結果をよりよく共有し、おそらく誰かを助けます。

メニューが消える問題は、プラグインまたはテーマのコードが、$wp_queryフィルタフックを使用してグローバルなpre_get_postsオブジェクトを誤って変更していることが原因である可能性があります。

私は問題を引き起こすコードがテーマにあることを発見しました:

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

このスニペットは、カテゴリアーカイブにカスタム投稿タイプを追加することになっていますが、wp_nav_menuのクエリにも影響します。

この問題を解決するために、私は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と原因は完全に異なる可能性がありますが、これでカテゴリテンプレートにメニューが表示されない問題を修正しました。

7
AndyDeGroo

私のために

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

pre_get_postsのハンドラでそれを修正しました。

1
Alex

pre_get_postsフィルターを追加していたため、メニュー項目を投稿に渡すことができなかったため、同じ問題が発生しました。これは私が解決した方法です:

以前、テーマのfunctions.phpにこのコードがありましたが、メインクエリを$post_typeのみで上書きしており、メニュー項目を渡すことなく、メニューは表示されませんでした。

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;
    }
}

そして、次のように'nav_menu_item'を渡すことを解決しました:

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