質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1296閲覧

タグ一覧にタグ無し記事へのリンクとその記事件数を入れたい(tag__not_inで除外した残りの投稿の件数を算出する方法は?)。

M.Y.

総合スコア29

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/01/18 14:18

編集2019/03/01 08:09

前提・実現したいこと

 ワードプレス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' );

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

修正

tag__not_inで除外した残りの投稿の件数を算出する方法があればそれを応用したい、となりますか。

タグのついていない記事を表示させ、その合計数を表示させるのであれば以下の方法で動きませんか。

php

1<?php 2$tags = get_terms('post_tag', array('fields'=>'ids') ); 3$args = array( 4 'post_type' => 'post', 5 'posts_per_page' => -1, 6 'tax_query' => array( 7 array( 8 'taxonomy' => 'post_tag', 9 'field' => 'id', 10 'terms' => $tags, 11 'operator' => 'NOT IN' 12 ) 13 ) 14); 15$untagged = new WP_Query( $args ); 16while($untagged->have_posts()){ 17 $untagged->the_post(); 18 echo '<h3><a href="'.get_the_permalink().'">'.get_the_title().'</a></h3>'; 19 echo "<br>"; 20} 21echo 'タグのついていない投稿数:'.$untagged->found_posts; 22?>

投稿2019/02/04 16:15

編集2019/02/04 19:38
unotalk

総合スコア124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

M.Y.

2019/02/04 16:28 編集

>こちらについては$found_postsが使えるかと思います。  found_postsは二つ目に掲げたコードの12行目で使用済みですが、これと別なのですか。  $found_postsについて、日本語版関数レファレンスには「現在のクエリ変数に一致する投稿の合計数」とありました。 https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query#.E3.83.A1.E3.82.BD.E3.83.83.E3.83.89.E3.81.A8.E3.83.97.E3.83.AD.E3.83.91.E3.83.86.E3.82.A3  しかし、その「現在のクエリ変数に一致する」指定の仕方が解らないので、うまく件数が出ないのです。どうすればいいのやら。
unotalk

2019/02/04 19:39

コードがかなり長くなっていたので、単純にしたいことをする方法を回答欄に書きました。 これがしたいことであっていますか。
M.Y.

2019/02/04 22:32 編集

>これがしたいことであっていますか。  while($untagged->have_posts()){ }のループ部分は、したいこととは異なります。サイドバーに出したいのはタグ無し記事各ページの一覧ではなく使用タグの一覧(タグリスト)であって、そのリスト最下部に「タグなし」として(タグ無し記事の各ページでなく)タグ無し記事一覧アーカイブへのリンクを出したいので。  しかし、tag__not_inに拘泥せず同じことをtax_queryで代替するやり方は、参考になりました。式は少し複雑になりますがこの方が汎用性があるみたいで。  Cf. https://elearn.jp/wpman/column/c20110907_01.html  これにより、望んだ通り、タグ無し記事の件数を表示できます。有り難うございます。  回答欄のコードからwhile部分は削除し、一部改変して採用させて戴きました。 $tags = get_terms('post_tag', array('fields'=>'ids') ); ↓ $tagids = get_terms( array('taxonomy'=>'post_tag', 'fields'=>'ids') ); 変数$tagsは既出なので改名。また、WordPressバージョン4.5.0以降の書き方にした(Cf. https://elearn.jp/wpman/function/get_terms.html)。 'field' => 'id', ↓  'field'=>'term_id', 「有効な値は 'term_id'(デフォルト)、'name'、'slug' または 'term_taxonomy_id' です」とのことなので。 Cf. https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query#.E3.82.BF.E3.82.AF.E3.82.BD.E3.83.8E.E3.83.9F.E3.83.BC.E3.81.AE.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF
unotalk

2019/02/04 23:07

書き方が古いものでしたね。。失礼しました。ひとまずタグ無し記事の件数を表示できそうとのこと、よかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問