カテゴリに投稿がない場合にもカテゴリページを表示する
3分目次
WordPress でカテゴリに記事がない場合、そのカテゴリページにアクセスすると 404 に飛ばされてしまうのを改善したい。
サンプルコード
これは meta description を出力するためのコード。正直 Google 側で meta description はよしなに出力してくれるので設定する必要性はあまり積極的には感じないが。
if (!function_exists('get_meta_description')) {
function get_meta_description() {
global $post;
if (is_singular('news') || is_single() || is_page()){ // 各投稿
$description = $post -> post_content;
if (empty($description)) return null;
$description = str_replace(array("\r\n","\r","\n"," "),'',$description);
$description = wp_strip_all_tags($description);
$description = mb_strimwidth($description,0,220,"...");
return $description;
} elseif (is_front_page() || is_home()){ // トップページ
if (get_bloginfo('description')) return get_bloginfo('description');
} elseif(is_category()) { // カテゴリページ
$category = get_the_category();
$cat_name = $category -> cat_name;
return $cat_name . 'の説明ページです。';
}
return null;
}
}
こちらは no category base 用のサンプルコード。通常のルーティングだとカテゴリーページの URL にhoge.com/category/categoryA
みたくcategory
が入ってしまうのを解消するためのコード。
add_filter('request', 'category_child_link');
if (!function_exists('category_child_link')){
function category_child_link( $query = array()) {
if (isset($query['category_name']) && strpos($query['category_name'], '/') === false && isset($query['name'])){
$parent_category = get_category_by_slug($query['category_name']);
$child_categories = get_categories('child_of='.$parent_category -> term_id);
foreach ($child_categories as $child) {
if (isset($query['name']) && $query['name'] === $child -> category_nicename) {
$query['category_name'] = $query['category_name'].'/'.$query['name'];
unset($query['name']);
}
}
}
return $query;
}
}
修正コード
解決方法 1
上の meta descirption ではget_the_category()
をget_queried_object()
に変更して対応できる。
if (!function_exists('get_meta_description')) {
function get_meta_description() {
global $post;
if (is_singular('news') || is_single() || is_page()){ // 各投稿
// 省略
} elseif(is_category()) { // カテゴリページ
$category = get_queried_object(); // 投稿がない場合用にget_the_categoryは使用しない
$cat_name = $category -> cat_name;
return $cat_name . 'の説明ページです。';
}
return null;
}
}
get_queried_object()
では下記のようにget_the_category()
より便利なデータを取得可能。返してくれるオブジェクトのキーもあまり変わらないので修正も少なくて済むはず。
参考: 関数リファレンス/get queried object
参考: WordPress のカテゴリー一覧ページでカテゴリー名とスラッグを取得する → getqueriedobject()
解決方法 2
また、get_categories()
を使用しているパターンでは、引数にhide_empty
を使用すれば対応できる。
add_filter('request', 'category_child_link');
if (!function_exists('category_child_link')){
function category_child_link( $query = array()) {
if (isset($query['category_name']) && strpos($query['category_name'], '/') === false && isset($query['name'])){
$parent_category = get_category_by_slug($query['category_name']);
$args = array(
'child_of' => $parent_category -> term_id,
'hide_empty' => 0,
);
$child_categories = get_categories($args);
foreach ($child_categories as $child) {
if (isset($query['name']) && $query['name'] === $child -> category_nicename) {
$query['category_name'] = $query['category_name'].'/'.$query['name'];
unset($query['name']);
}
}
}
return $query;
}
}