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' ),
) );
任意の助けやポインタをいただければ幸いです
私はこの質問はかなり古くからあると知っていますが、まだ答えがないので、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と原因は完全に異なる可能性がありますが、これでカテゴリテンプレートにメニューが表示されない問題を修正しました。
私のために
if ($q->get('post_type') != 'post') {
return;
}
pre_get_postsのハンドラでそれを修正しました。
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;
}
}