tag:crieit.net,2005:https://crieit.net/tags/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%BF%E3%82%AF%E3%82%BD%E3%83%8E%E3%83%9F%E3%83%BC/feed
「カスタムタクソノミー」の記事 - Crieit
Crieitでタグ「カスタムタクソノミー」に投稿された最近の記事
2022-03-06T00:02:57+09:00
https://crieit.net/tags/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%BF%E3%82%AF%E3%82%BD%E3%83%8E%E3%83%9F%E3%83%BC/feed
tag:crieit.net,2005:PublicArticle/18136
2022-03-06T00:02:57+09:00
2022-03-06T00:02:57+09:00
https://crieit.net/posts/count-term-using-include-private-article-20220306
(WordPress) 非公開記事も含めた記事数カウントを管理画面に表示するプラグイン
<h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2>
<p>WordPress でブログを運用していると、カテゴリーやタグ、カスタムタクソノミーを整理したくなることがあります。</p>
<p>特にタグのように非階層型の入力形式のタクソノミーの場合は自由入力なので、スペースの有無や誤字等で似たようなタームを誤って生成しがちです。</p>
<ul>
<li><code>Windows 11</code> と <code>Windows11</code> (スペースの有無)</li>
<li><code>Google Chrome</code> と <code>Gooogle Chrome</code> (誤字。 <code>o</code> が1つ多い)</li>
</ul>
<p>しかも、異なるタグとして集計されるのでタグクラウドの中から絞り込むと思わぬところで必要な記事が漏れていて「あの記事絶対タグが付いているはずなのに……」と見付からずに右往左往したり。</p>
<p>基本的には管理画面の「投稿」→「タグ」に進んでタグの一覧からどちらか一方にタグを付け直して、もう片方のタグで「カウント」つまり記事数が0になったタグを削除すれば良いとは思います。</p>
<p>しかし、ここで一つ課題が。</p>
<p>技術記事等で自分用メモとして残すための非公開記事がいくつかあったりするのですが、先程のタグ編集画面の「カウント」は非公開記事は除外された数のようです。</p>
<p>そのため、例えタグ編集画面で「カウント」が0になっていても、実際は非公開記事で使用されていた……ということが考えられます。これでは迂闊にタグを削除することができません。</p>
<h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2>
<p>そこで、タグ編集画面で非公開記事も含めたカウントを表示するプラグインを作りました。</p>
<pre><code class="php">class FrostColumns
{
protected $taxName;
protected $postTypeName;
protected $countIncludePrivateID;
protected $countIncludePrivateLabel;
/**
* mb_strlen() での空文字列判定のラッパー関数
*
* @param string $str : 入力文字列
*
* @return boolean : 出力文字列
*/
public function boolStrLen( $str )
{
return mb_strlen(
$str,
'UTF-8'
) > 0;
}
/**
* コンストラクタ
*
*/
public function __construct()
{
if(
mb_strpos(
parse_url(
$_SERVER['REQUEST_URI'],
PHP_URL_PATH
),
'edit-tags.php',
0,
'UTF-8'
) !== false
) {
// edit-tags.php のみで動作
$tax = esc_html(
filter_input(
INPUT_GET,
'taxonomy',
FILTER_SANITIZE_SPECIAL_CHARS
)
);
// タクソノミーの名前を取得
$this->taxName = $this->boolStrLen( $tax )
? $tax
: '';
$posttype = esc_html(
filter_input(
INPUT_GET,
'post_type',
FILTER_SANITIZE_SPECIAL_CHARS
)
);
// 投稿タイプの名前を取得
$this->postTypeName = $this->boolStrLen( $posttype )
? $posttype
: '';
// ラベル
$this->countIncludePrivateID = 'count_include_private';
$this->countIncludePrivateLabel = 'カウント(非公開・予約含)';
}
}
/**
* SQLを直接発行して公開済み・非公開・予約投稿の記事の投稿IDのみの一覧を取得、その数をリンクと共に出力する
*
* @param int $termID : タームID
*
*/
public function countArticlesBySQL( $termID )
{
// $wpdb 読み込み (global で宣言した変数のスコープの兼ね合いでここで読み込み宣言する)
require_once( ABSPATH . '/wp-load.php');
global $wpdb;
// 各タームのオブジェクトを取得
$termObj = get_term( $termID, $this->taxName );
// 投稿のカテゴリー、タグはキー名がタクソノミー編集ページと投稿一覧ページで異なるので変換する
$taxNameParam = $this->taxName;
switch ( $this->taxName ) {
case 'category':
$taxNameParam = 'category_name';
break;
case 'post_tag':
$taxNameParam = 'tag';
break;
default:
$taxNameParam = $this->taxName;
break;
}
// カスタム投稿タイプならばリンクのGETパラメータに投稿タイプの名前を付与
$postTypeParam = $this->boolStrLen( $this->postTypeName )
? '&post_type=' . $this->postTypeName
: '';
// SQLのクエリで指定する投稿タイプの名前の文字列をセット
$postTypeDBParam = $this->boolStrLen( $this->postTypeName )
? $this->postTypeName
: 'post';
// WP_Query では結果の投稿オブジェクトが大き過ぎてメモリを食い潰すので直接SQLを発行してIDのみ結果として取得して省力化する
$the_query = "SELECT " . $wpdb->prefix . "posts.ID FROM " . $wpdb->prefix . "posts LEFT JOIN " . $wpdb->prefix . "term_relationships ON (" . $wpdb->prefix . "posts.ID = " . $wpdb->prefix . "term_relationships.object_id) WHERE 1=1 AND ( " . $wpdb->prefix . "term_relationships.term_taxonomy_id IN ( %d ) ) AND " . $wpdb->prefix . "posts.post_type = %s AND ((" . $wpdb->prefix . "posts.post_status = 'publish' OR " . $wpdb->prefix . "posts.post_status = 'future' OR " . $wpdb->prefix . "posts.post_status = 'private')) GROUP BY " . $wpdb->prefix . "posts.ID ORDER BY " . $wpdb->prefix . "posts.post_date DESC";
$results = $wpdb->get_results(
$wpdb->prepare(
$the_query,
$termID,
$postTypeDBParam
)
);
$cnt = count($results);
echo <<<CNT
<a href="edit.php?{$taxNameParam}={$termObj->slug}{$postTypeParam}">{$cnt}</a>
CNT;
}
/**
* 欄としての列の出力
*
* @param array $columns : 列
*
* @return array $columns : 列
*
*/
function addCountIncludePrivateColumns( $columns )
{
echo <<<STL
<style>
.taxonomy-{$this->taxName} .manage-column.num \{width: 90px;\}
.taxonomy-{$this->taxName} .manage-column.column-id \{width: 60px;\}
</style>
STL;
$columns[$this->countIncludePrivateID] = $this->countIncludePrivateLabel;
return $columns;
}
/**
* 追加した列に実際の値を表示させる
*
* @param string $content : 出力するコンテンツ
* @param string $column_name : 列名
* @param int $term_id : タームID
*
*/
function customCountIncludePrivateColumns( $content, $column_name, $term_id )
{
if ( $column_name == $this->countIncludePrivateID ) {
$this->countArticlesBySQL( $term_id );
}
}
/**
* 初期処理。アクションフック・フィルターフックを発動させる
*
*/
public function initialize()
{
// 列の追加
add_filter(
'manage_edit-' . $this->taxName . '_columns',
[
$this,
'addCountIncludePrivateColumns'
]
);
// 追加した列に実際の値を表示させる
add_action(
'manage_' . $this->taxName . '_custom_column',
[
$this,
'customCountIncludePrivateColumns'
],
10,
3
);
}
}
// 処理
$wp_ab_frostcolumns = new FrostColumns();
if( is_admin() ) {
// 管理者画面を表示している場合のみ実行
$wp_ab_frostcolumns->initialize();
}
</code></pre>
<ul>
<li>コンストラクタ:
<ul>
<li>URLをパースして <code>edit-tags.php</code> のみで動作するように判定</li>
<li>GETパラメータからタクソノミーの名前と(必要ならば)投稿タイプの名前を取得</li>
</ul></li>
<li><code>countArticlesBySQL</code>メソッド:
<ul>
<li>本プラグインの肝</li>
<li>後で使用するため <code>wp-load.php</code> から <code>$wpdb</code> で WordPress のDBオブジェクトを読み込み</li>
<li><code>edit-tags.php</code> ではカテゴリーは <code>category</code>、タグは <code>post_tag</code> だが投稿一覧ページではそれぞれ <code>category_name</code>, <code>tag</code> とキーとなる文字列が変わるため遷移時の GETパラメータ に付与するときのために変換をかけておく</li>
<li>カスタム投稿タイプの場合、 SQLクエリ や GETパラメータ への付与が必要になるため処理</li>
<li>タクソノミーと投稿タイプ、投稿ステータス( <code>publish</code>, <code>private</code>, <code>future</code> のいずれか)で絞り込むSQLクエリを発行して投稿IDのみのオブジェクトを取得する
<ul>
<li>WP_Query で投稿データ全体のオブジェクトを取得すると重過ぎて PHP のメモリバッファを食い潰してしまうため、最小限になるように調整</li>
</ul></li>
<li>記事数を <code>count</code> で取得して、 <code>a</code>タグ として出力</li>
</ul></li>
<li><code>addCountIncludePrivateColumns</code>メソッド:
<ul>
<li>テーブル出力にオリジナルの列を出力する。フィルターフック</li>
</ul></li>
<li><code>customCountIncludePrivateColumns</code>メソッド:
<ul>
<li>追加した列に実際の値を表示させるアクションフック</li>
<li>テーブル出力のキーが予めセットされていた文字列 (今回のオリジナル列) と同じ場合、 <code>countArticlesBySQL</code>メソッド を呼ぶ</li>
</ul></li>
</ul>
<p>やっていることとしてはこのような感じ。</p>
<h2 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h2>
<p>それでは、デモで検証してみます。</p>
<p><a href="https://crieit.now.sh/upload_images/f1a6256dabde4394bf1b525d84800e4c62237b343fbf6.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f1a6256dabde4394bf1b525d84800e4c62237b343fbf6.jpg?mw=700" alt="デモ環境の9つの記事" /></a></p>
<p>このように9つの記事を適当に作ってみました。今回はプラグインの効果をタグで試すことにします。</p>
<p><a href="https://crieit.now.sh/upload_images/13ea92d49935623f0ecaa3028b7f88e662237b3ce7c1d.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/13ea92d49935623f0ecaa3028b7f88e662237b3ce7c1d.jpg?mw=700" alt="「ヘイルストーム」で記事を検索すると公開記事2件、非公開記事2件と2件ずつ、合計4件がヒット" /></a></p>
<p>例えば、「ヘイルストーム」で記事を検索すると公開記事2件、非公開記事2件と2件ずつ、合計4件がヒットします。</p>
<p><a href="https://crieit.now.sh/upload_images/969bb40d5160e13ccca7510c8dcbd18262237b4494120.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/969bb40d5160e13ccca7510c8dcbd18262237b4494120.jpg?mw=700" alt="タグの編集画面。先の「ヘイルストーム」の記事数は2と表示されている" /></a></p>
<p>ところが、通常のタグの編集画面では先の「ヘイルストーム」の記事数は2と表示されています。実際は非公開記事も含めて4件あるはずで、今回は「4」と表示されてほしいわけです。</p>
<p><a href="https://crieit.now.sh/upload_images/7450e2f60c9a03d568fea581118bc4a762237b4c77772.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7450e2f60c9a03d568fea581118bc4a762237b4c77772.jpg?mw=700" alt="プラグインを有効化した際のタグの編集画面。先の「ヘイルストーム」の記事数は追加された列で4と表示されている" /></a></p>
<p>それじゃスペルカード発動。先の「ヘイルストーム」の記事数は追加された列で4と表示されるようになりました。意図通りです。</p>
<p><a href="https://crieit.now.sh/upload_images/34fefff76205debe5afe7a16178ecb7362237b5698652.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/34fefff76205debe5afe7a16178ecb7362237b5698652.jpg?mw=700" alt="別のサンプル。伸ばし棒のない「コールドディヴィニティ」は非公開記事1件のみ" /></a></p>
<p>別のサンプル。誤字した例として伸ばし棒のない「コールドディヴィニティ」は上述のタグ編集画面だと通常0件、追加列では1件と表示されています。ページ遷移すると、非公開記事1件のみが一覧に表示されています。</p>
<p>こういうケースでは伸ばし棒のある「コールドディヴィニティー」に直して、プラグインで追加された列も含めて「0」表示となったことを確認した後に伸ばし棒のない「コールドディヴィニティ」タグを削除する、というフローで活用できる、という寸法です。</p>
<h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2>
<h3 id="一覧ページのテーブルに列を追加・カスタマイズ"><a href="#%E4%B8%80%E8%A6%A7%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E5%88%97%E3%82%92%E8%BF%BD%E5%8A%A0%E3%83%BB%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA">一覧ページのテーブルに列を追加・カスタマイズ</a></h3>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://code-ex.dev/wordpress/322/">WordPress の管理画面でターム一覧をカスタマイズする方法 | Source Code EX</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://www.nxworld.net/wp-add-taxonomy-columns-term-id.html">WordPress:管理画面のカテゴリーやタクソノミー一覧ページにID(タームID)項目を追加する方法 - NxWorld</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://wemo.tech/2342">WordPress管理画面のカテゴリー・タグの一覧テーブルにIDを表示する方法 | WEMO</a></li>
</ul>
<h3 id="(未使用だが参考にはなった) 表示処理"><a href="#%28%E6%9C%AA%E4%BD%BF%E7%94%A8%E3%81%A0%E3%81%8C%E5%8F%82%E8%80%83%E3%81%AB%E3%81%AF%E3%81%AA%E3%81%A3%E3%81%9F%29+%E8%A1%A8%E7%A4%BA%E5%87%A6%E7%90%86">(未使用だが参考にはなった) 表示処理</a></h3>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/WordPress/WordPress/blob/master/wp-admin/edit-tags.php#L613">WordPress\/edit-tags.php at master ・ WordPress\/WordPress ・ GitHub</a></li>
</ul>
<p><code>$wp_list_table->display();</code> でテーブルを出力している。</p>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-wp-list-table.php#L1268">WordPress\/class-wp-list-table.php at master ・ WordPress\/WordPress ・ GitHub</a></li>
</ul>
<p>基底クラスのこの部分が該当処理。ただし汎用的な内容。</p>
<h4 id="(未使用だが参考にはなった) WP_Terms_List_Table"><a href="#%28%E6%9C%AA%E4%BD%BF%E7%94%A8%E3%81%A0%E3%81%8C%E5%8F%82%E8%80%83%E3%81%AB%E3%81%AF%E3%81%AA%E3%81%A3%E3%81%9F%29+WP_Terms_List_Table">(未使用だが参考にはなった) WP_Terms_List_Table</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://developer.wordpress.org/reference/classes/wp_terms_list_table/">WP_Terms_List_Table | Class | WordPress Developer Resources</a></li>
</ul>
<p>使用しているクラス</p>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-wp-terms-list-table.php#L569">WordPress\/class-wp-terms-list-table.php at master ・ WordPress\/WordPress ・ GitHub</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://developer.wordpress.org/reference/classes/wp_terms_list_table/column_posts/">WP_Terms_List_Table::column_posts() | Method | WordPress Developer Resources</a></li>
</ul>
<p><code>column_posts()</code>メソッドがそれっぽい。が、引数の <code>$tag</code> に既に情報が入っているようなのでこの中ではない。</p>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://developer.wordpress.org/reference/classes/wp_list_table/">WP_List_Table | Class | WordPress Developer Resources</a></li>
</ul>
<p><code>display_rows()</code>メソッドでもない。</p>
<h4 id="ソート可能な列の出力"><a href="#%E3%82%BD%E3%83%BC%E3%83%88%E5%8F%AF%E8%83%BD%E3%81%AA%E5%88%97%E3%81%AE%E5%87%BA%E5%8A%9B">ソート可能な列の出力</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://developer.wordpress.org/reference/hooks/manage_this-screen-id_sortable_columns/">manage_{$this->screen->id}_sortable_columns | Hook | WordPress Developer Resources</a></li>
</ul>
<h3 id="$wpdb"><a href="#%24wpdb">$wpdb</a></h3>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://agohack.com/wpdb-select-with-prepare/">[WordPress] $wpdb を使って SELECT 結果取得</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://hyperschool.net/textbook/wordpress/wordpress_wp_query.html">WP_Queryを利用した投稿の取得 · GitBook</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/benibana2001/items/259fb83ad37ca950cd78">$wpdb->prepare のプレースホルダの書き方 - Qiita</a></li>
</ul>
<h4 id="テーブルのプレフィックス"><a href="#%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E3%83%97%E3%83%AC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9">テーブルのプレフィックス</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://drawer-jp.com/programing/wordpress-table-prefix/">WordPress テーブル接頭辞 取得方法 | 引き出しブログ</a></li>
</ul>
<h3 id="(未使用) WP_Query"><a href="#%28%E6%9C%AA%E4%BD%BF%E7%94%A8%29+WP_Query">(未使用) WP_Query</a></h3>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://notnil-creative.com/blog/archives/1288">WP_Queryの使い方をPHPコードにまとめた便利なコード・スニペット :: Takuro Hishikawa</a></li>
</ul>
<h4 id="(未使用) 件数取得"><a href="#%28%E6%9C%AA%E4%BD%BF%E7%94%A8%29+%E4%BB%B6%E6%95%B0%E5%8F%96%E5%BE%97">(未使用) 件数取得</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="http://kihon-no-ki.com/wordpress-wp-query-found-posts-property">[WordPress] WP_Queryで投稿取得後に全件数を求める | きほんのき</a></li>
</ul>
<p><code>found_posts</code>プロパティ</p>
<h4 id="(未使用) wp_count_posts()"><a href="#%28%E6%9C%AA%E4%BD%BF%E7%94%A8%29+wp_count_posts%28%29">(未使用) wp_count_posts()</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://simplesimples.com/web/application/wordpress/wp_count_posts/">WordPressで記事の数を取得する → wp_count_posts() か found_posts - シンプルシンプルデザイン WordPress</a></li>
</ul>
<p>複雑な条件の件数となると <code>WP_Query</code> 一択。</p>
<h3 id="タクソノミー→ターム"><a href="#%E3%82%BF%E3%82%AF%E3%82%BD%E3%83%8E%E3%83%9F%E3%83%BC%E2%86%92%E3%82%BF%E3%83%BC%E3%83%A0">タクソノミー→ターム</a></h3>
<h4 id="(未使用だが参考にはなった) WP_Term_Query"><a href="#%28%E6%9C%AA%E4%BD%BF%E7%94%A8%E3%81%A0%E3%81%8C%E5%8F%82%E8%80%83%E3%81%AB%E3%81%AF%E3%81%AA%E3%81%A3%E3%81%9F%29+WP_Term_Query">(未使用だが参考にはなった) WP_Term_Query</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://wemo.tech/800">WordPressでカテゴリー・タグ・タクソノミーのタームを全取得して一覧表示する方法【WP_Term_Query \/ get_terms()】 | WEMO</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://developer.wordpress.org/reference/classes/wp_term_query/">WP_Term_Query | Class | WordPress Developer Resources</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-term-query.php">WordPress\/class-wp-term-query.php at master · WordPress\/WordPress · GitHub</a></li>
</ul>
<p><code>count</code>プロパティ はDBの値を読むだけ。逆に言えばDBに値が保存されていることが判明。</p>
<h4 id="(未使用だが参考にはなった) タクソノミー操作系の目星"><a href="#%28%E6%9C%AA%E4%BD%BF%E7%94%A8%E3%81%A0%E3%81%8C%E5%8F%82%E8%80%83%E3%81%AB%E3%81%AF%E3%81%AA%E3%81%A3%E3%81%9F%29+%E3%82%BF%E3%82%AF%E3%82%BD%E3%83%8E%E3%83%9F%E3%83%BC%E6%93%8D%E4%BD%9C%E7%B3%BB%E3%81%AE%E7%9B%AE%E6%98%9F">(未使用だが参考にはなった) タクソノミー操作系の目星</a></h4>
<ul>
<li><code>get_tax_sql()</code>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/WordPress/WordPress/blob/master/wp-includes/taxonomy.php#L902">WordPress\/taxonomy.php at master · WordPress\/WordPress · GitHub</a></li>
</ul></li>
<li>実際にテーブルを作っているクラス
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-wp-terms-list-table.php#L569">WordPress\/class-wp-terms-list-table.php at master · WordPress\/WordPress · GitHub</a>
<ul>
<li>基底クラス: <a target="_blank" rel="nofollow noopener" href="https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/class-wp-list-table.php">WordPress\/class-wp-list-table.php at master · WordPress\/WordPress · GitHub</a></li>
</ul></li>
</ul></li>
</ul>
<h4 id="(未使用だが参考にはなった) タクソノミーやタームに関係ありそうなクラス"><a href="#%28%E6%9C%AA%E4%BD%BF%E7%94%A8%E3%81%A0%E3%81%8C%E5%8F%82%E8%80%83%E3%81%AB%E3%81%AF%E3%81%AA%E3%81%A3%E3%81%9F%29+%E3%82%BF%E3%82%AF%E3%82%BD%E3%83%8E%E3%83%9F%E3%83%BC%E3%82%84%E3%82%BF%E3%83%BC%E3%83%A0%E3%81%AB%E9%96%A2%E4%BF%82%E3%81%82%E3%82%8A%E3%81%9D%E3%81%86%E3%81%AA%E3%82%AF%E3%83%A9%E3%82%B9">(未使用だが参考にはなった) タクソノミーやタームに関係ありそうなクラス</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-tax-query.php">WordPress\/class-wp-tax-query.php at master · WordPress\/WordPress · GitHub</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-taxonomy.php">WordPress\/class-wp-taxonomy.php at master · WordPress\/WordPress · GitHub</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://developer.wordpress.org/reference/classes/wp_term/">WP_Term | Class | WordPress Developer Resources</a>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-term.php">WordPress\/class-wp-term.php at master · WordPress\/WordPress · GitHub</a>
<ul>
<li>Termのオブジェクト(ハコ)という感じ</li>
</ul></li>
</ul></li>
</ul>
<h4 id="get_term()"><a href="#get_term%28%29">get_term()</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="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/get_term">関数リファレンス\/get term - WordPress Codex 日本語版</a></li>
</ul>
<h3 id="PHP"><a href="#PHP">PHP</a></h3>
<h4 id="ヒアドキュメント"><a href="#%E3%83%92%E3%82%A2%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88">ヒアドキュメント</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/language.types.string.php">PHP: 文字列 - Manual</a></li>
</ul>
<h4 id="スコープ"><a href="#%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97">スコープ</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/language.variables.scope.php">PHP: 変数のスコープ - Manual</a></li>
</ul>
<h4 id="GETパラメータ"><a href="#GET%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF">GETパラメータ</a></h4>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/function.filter-input.php">PHP: filter_input - Manual</a></li>
</ul>
<p><code>filter_input(INPUT_GET, 'taxonomy', FILTER_SANITIZE_SPECIAL_CHARS)</code> で取得できる。</p>
arm-band
tag:crieit.net,2005:PublicArticle/17740
2021-11-04T23:46:16+09:00
2021-11-04T23:46:16+09:00
https://crieit.net/posts/wordpress-switch-if-match-certain-terms-in-singlepage-20211104
WordPress のシングルページで特定のタクソノミーの場合のみ表示を変えたい
<p>表題の通り、WordPress のシングルページで特定のタクソノミーの場合のみ表示を変えたいケースのスニペットをメモ。</p>
<p>さっくり終わらせたかったのでとりあえずできたものを貼っておきます。</p>
<h2 id="スニペット"><a href="#%E3%82%B9%E3%83%8B%E3%83%9A%E3%83%83%E3%83%88">スニペット</a></h2>
<pre><code class="php"><?php
if(
in_array(
'AN_TAXONOMY_SLUG',
array_column(
get_the_terms(
$post->ID,
'AN_TERMS_KEY'
),
'slug'
)
)
) {
?>
<!-- Some codes -->
<?
}
?>
</code></pre>
<p>今回はこれでfix。</p>
<h2 id="サンプルケース"><a href="#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9">サンプルケース</a></h2>
<p>例えば「cms」というカスタムタクソノミーに「wordpress」,「basercms」,「concretecms」といったタクソノミー、およびそのスラッグが存在した場合に「wordpress」のみ if内 の内容を表示させたい場合は次のようなイメージ。</p>
<pre><code class="php"><?php
if(
in_array(
'wordpress',
array_column(
get_the_terms(
$post->ID,
'cms'
),
'slug'
)
)
) {
?>
<!-- Some codes -->
<?
}
?>
</code></pre>
<h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2>
<h3 id="カスタムタクソノミーの表示"><a href="#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%BF%E3%82%AF%E3%82%BD%E3%83%8E%E3%83%9F%E3%83%BC%E3%81%AE%E8%A1%A8%E7%A4%BA">カスタムタクソノミーの表示</a></h3>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://www.web-myoko.net/blog/wordpress/custom-post-type-term-name-single-xx-php-wordpress/">カスタム投稿タイプのターム名を[single-XX.php]に表示する方法【WordPress】 | 妙高Web屋</a></li>
<li><a target="_blank" rel="nofollow noopener" href="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/get_the_terms">関数リファレンス/get the terms - WordPress Codex 日本語版</a></li>
</ul>
<h3 id="PHP, 連想配列の中の特定のキーの値で判定"><a href="#PHP%2C+%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97%E3%81%AE%E4%B8%AD%E3%81%AE%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%AD%E3%83%BC%E3%81%AE%E5%80%A4%E3%81%A7%E5%88%A4%E5%AE%9A">PHP, 連想配列の中の特定のキーの値で判定</a></h3>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://1-notes.com/php-in-array/">PHP | in_array()で配列・多次元配列のデータから値が存在するか判別する方法 | ONE NOTES</a></li>
</ul>
arm-band