wordpress
WordPressのタグ検索などのタグ利用で、タグを類別にする場合の備忘
作成日: 2025年1月15日
これはタグ付けによる複数条件での検索結果を表示する、ポータルサイト機能を合わせた際にタグの類別/カテゴリー別にしたい場合に用いる。
類別=カテゴリのようなものだが、接頭文字を付けて管理。
ここではサンプルとして「市町村」という接頭を用いた例。
投稿ページでタグ単体を表示
<?php $post_tags = get_the_tags();if ($post_tags && !is_wp_error($post_tags)) {foreach ($post_tags as $tag) {if (strpos($tag->name, '市町村') === 0) {$remaining_text = mb_substr($tag->name, mb_strlen('市町村'));if (!empty($remaining_text)) {echo '<span>' . esc_html($remaining_text) . '</span>';}break;}}}?>
検索ボックス(indexやcategoryに設置、この部分はチェックボックス)
これはポータルなどで用いるAND検索の際の検索用の入れ子。
<?php
// 投稿のタグを取得
$post_tags = get_tags(array(
'hide_empty' => true, // 投稿に関連付けられたタグのみを取得
));
if ($post_tags && !is_wp_error($post_tags)) {
foreach ($post_tags as $tag) {
// タグ名が「市町村」で始まるかチェック
if (strpos($tag->name, '市町村') === 0) {
// 元のタグ名を保持しつつ、「市町村」を削除した部分を取得
$original_tag = $tag->name;
$remaining_text = mb_substr($original_tag, mb_strlen('市町村'));
// 残りの文字列が空でない場合のみ出力
if (!empty($remaining_text)) {
echo '<label>';
echo '<input type="checkbox" class="checks" value="' . esc_attr($original_tag) . '" name="posttag" />';
echo esc_html($remaining_text);
echo '</label>';
}
}
}
}
?>
tag.phpでの見出し用最初と被ったけどのそのまま
<h2>
<?php
$str = $_SERVER['REQUEST_URI'];
$dec = urldecode($str);
$rep = preg_replace('/\/tag\//', '', $dec);
$rep2 = preg_replace('/\/page\/[0-9]+/', '', $rep); // ページ部分を削除
// 前方一致で「市町村」を削除
if (strpos($rep2, '市町村') === 0) {
$rep2 = mb_substr($rep2, mb_strlen('市町村')); // 「市町村」を削除
}
echo esc_html($rep2); // 安全に出力
?> での検索結果
</h2>
titleタグなどへの出力
タグの類別のために先頭に付けた指定の単語を削除。
title用=ページナンバーは残す。
<?php $str = $_SERVER['REQUEST_URI']; $dec = urldecode($str); $rep = preg_replace('/\/tag\//', '', $dec); $rep2 = preg_replace('/\/page\//', 'ページ', $rep); $rep2 = str_replace(' ', ',', $rep2);$remove_words = array('市町村', '特徴');foreach ($remove_words as $word) { if (strpos($rep2, $word) === 0) {$rep2 = mb_substr($rep2, mb_strlen($word)); }}if (preg_match('/ページ[0-9]+/', $rep2)) { $rep2 = preg_replace('/(ページ[0-9]+)/', 'に該当するもの $1', $rep2);} else { $rep2 .= 'に該当するもの';}echo esc_html($rep2);?>|<?php bloginfo(); ?>
description用などナンバリング削除。
東京都内の<?php $str = $_SERVER['REQUEST_URI']; $dec = urldecode($str); $rep = preg_replace('/\/tag\//', '', $dec); $rep2 = preg_replace('/\/page\/[0-9]+/', '', $rep); $rep2 = str_replace(' ', ', ', $rep2);$remove_words = array('市町村', '特徴');foreach ($remove_words as $word) { if (strpos($rep2, $word) === 0) { $rep2 = mb_substr($rep2, mb_strlen($word)); }}$tagres = esc_html($rep2);?>
<?php echo $tagres;?>
<?php /*<?php bloginfo(); ?>*/?>〇〇<?php $str = $_SERVER['REQUEST_URI']; $dec = urldecode($str); $rep = preg_replace('/\/tag\//', '', $dec); $rep2 = implode('', preg_match_all('/[0-9]+/', $rep, $matches) ? $matches[0] : []); foreach ($remove_words as $word) {if (strpos($rep2, $word) === 0) { $rep2 = mb_substr($rep2, mb_strlen($word)); }}echo esc_html($rep2);?> <?php if(have_posts()): while(have_posts()): the_post(); ?><?php $names = get_the_title() . '、'; echo esc_html($names); ?><?php endwhile; else: ?>に該当するものはありません<?php endif; ?>
タグをurlから抽出し羅列する部分はOPGやJSONでも使うので変数化し、<?php echo $tagres;?>これで表示。
実装コードをコピペしたから余計なものも混じってるが、備忘なので。