前提・実現したいこと
ワードプレス5.0.3–jaで、タグ一覧を作成中です。
その際、タグが付いてない投稿記事へのリンクも「タグなし」として、一番下に表示させたい。――下記のページみたいに(そこで「タグなし」をクリックするとhttp://mediamarker.net/u/ユーザー名/tagnull/タグなし/
へと移動します)。
メディアマーカー>ゆきあかりの本棚
しかしそのタグの無い記事数をカウントするのが、うまくゆきません。
試したこと
初期設定の「タグクラウド」のプラグインではタグ無し投稿へのリンクは生成できないみたいなので、自作します。taglist.phpにコードを書き、サイドバーに呼び出す方式です(「WordPress でプラグイン使わずにウィジェットで PHP コード動かす」を参考に)。
次に、「WordPressの管理画面でタグが付いていない記事だけを一覧表示する方法って無いの?」を改造して子テーマのfunctions.phpに書き込み、タグを付けてない記事を一覧表示可能にしました。
PHP
1function query_untagged_posts($query){ 2 if($query->is_main_query() && $_GET['tagnull']==1){ 3 $a=array(); 4 foreach(get_tags() as $t){ 5 $a[]=$t->term_id; 6 } 7 $query->set('tag__not_in',$a);//全てのタグのIDを列挙して除外 8 } 9 return $query; 10} 11add_filter('pre_get_posts','query_untagged_posts');
これで、http://サイト名/wp/?tagnull=1
にアクセスするとタグ無し記事の一覧が表示されます(現在8件)。但し、他のタクソノミーや検索結果のアーカイブと違ってタイトル(h1要素)が出力されない等の問題があり、これもそのうち何とか解決したいもの……(2019-03-01追記参照)。
他方、使用タグのリストを出力するtaglist.phpは、「関数リファレンス/get tags」の「用例」を基にして、以下の通りになりました。
php
1<?php 2$tags = get_tags('orderby=count&order=DESC&number=0');//件数多い順表示 3$html = '<table class="post_tags">'; 4foreach ( $tags as $tag ) { 5 $tag_link = get_tag_link( $tag->term_id ); 6 7 $html .= "<tr><td class='tag_count'>{$tag->count}</td>"; 8 $html .= "<td class='tag_name'><a href='{$tag_link}' title='{$tag->name}:{$tag->description}' class='{$tag->slug}'>{$tag->name}</a></td></tr>"; 9} 10if(function_exists('query_untagged_posts')){ 11 $tagnull_query = new WP_Query('tagnull');//ここがまづい? 12 $tagnull_count = $tagnull_query->found_posts;//これでは駄目? 13 $tagnull_uri = add_query_arg( 'tagnull', '1' , home_url('/') ); 14$html .= "<tr><td class='sidetag_count'>{$tagnull_count}</td><td class='sidetag_name'><a href='{$tagnull_uri}'>タグなし</a></td></tr>"; 15} 16$html .= '</table>'; 17echo "\n".$html."\n"; 18?>
上記のソースで「タグなし」のリンク出力は成功しましたが、そのタグの無い投稿の件数を出す方法が解りません。実行すると、件数はタグ無し記事だけを抽出した数値でなく全投稿記事分の全件数になってしまって、失敗でした。
WP_Query('tagnull')
の箇所を、WP_Query('tagnull=1')
とか変更してみても結果に変化無し。WP_Query(['tagnull']==1)
やWP_Query(['tagnull']==0)
だと0件になりました。
tagnullをクエリーとして認識させればいいのかしらんと思って、やぶれかぶれで、functions.phpで先のquery_untagged_posts()関数の前に次の記述を書き入れましたが、やはり効果無し。
php
1function custom_query_vars( $public_query_vars ) { 2 $public_query_vars[] = 'tagnull'; 3 return $public_query_vars; 4} 5add_filter( 'query_vars', 'custom_query_vars' );
まだWordPressやPHPのことをよく理解できてないので、見当外れのことをやったかもしれません。
どうすれば、「タグなし」の件数を勘定して表示させられますか。
より一般的な設問にすると、tag__not_in
で除外した残りの投稿の件数を算出する方法があればそれを応用したい、となりますか。
宜しく御教示下さい。
2019-03-01追記
ページ・タイトル表示については以下の通り解決した。
index.phpの<?php if ( is_home() && ! is_front_page() ) : ?>
……</header>
の次に下記コードを挿入。
PHP
1<?php elseif($_GET['tagnull']==1): ?> 2 <header class="page-header"> 3 <h1 class="page-title">タグなし</h1> 4 </header><!-- .page-header -->
さらに、これを<title>タグと統一するため、functions.phpに下記コードも追記。
PHP
1function change_document_title_parts( $title ) { 2 if ($_GET['tagnull']==1 || $wp_query->query_vars['tagnull'] == '1') { 3 $title['title'] = esc_html('タグなし | ').$title['title'];$title['tagline'] = ''; 4 } 5 return $title; 6} 7add_filter( 'document_title_parts', 'change_document_title_parts' );
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/04 16:28 編集
2019/02/04 19:39
2019/02/04 22:32 編集
2019/02/04 23:07