この機能があると、とても便利だと思うのですが、なかなか回答がつかないので…
Worpress初心者です。
PHPがそれなりにわかるという暗黙の了解でレスしてみます。
query.phpの&get_posts()を眺めてみた(いや~すごく長くて驚いた)のですが、タグについては[tag_slug__in](「,」区切りでOR検索相当)と[tag_slug__and](「+」でAND検索相当)しか実装されていません(しかも同時に「,」「+」の両方は指定できないという…)
この周辺でフックできるのはpre_get_postsですが、小手先だけで実装するわけにはいかないので、私も「だれか詳しいかたよろしく」という感じです(笑)
コアコードはいじりたくないですし…
こんにちは。
私もあまり詳しくないのですが書き込みます。
そもそも論になってしまいますが、WordPress のタグのスラッグではハイフン(-)の使用が許可されていますので、 ?tag=A,B,C-D
は A タグと B タグと C-D タグという 3 つのタグでリクエストしていると解釈するのが WordPress の挙動として自然です。ダメだったのも無理はないですね。
新しく除外タグを指定できるようなパラメータを準備し、 kurosquare さんがご指摘の通り pre_get_posts フィルタにて除外処理を行うのがとりあえずの落としどころかと思います。
以下に例を挙げますが、このコードのセキュリティ上の安全性はかなり怪しく、一切保証できませんので、あくまでヒントとしてお試しになり、感じをつかんだ上で、より安全なコードをご自分の責任で記述してください。また、本当は WP_Rewrite も触れないと、タグで絞り込む任意のループにまで影響するのでわりと問題ありです。ご了承ください。
以下をお使いのテーマの functions.php に追加し、除外したいタグのスラッグを extag=X+Y+Z などという形式でリクエストします。
function add_extag_query( $q=array() ) {
if ( $q->is_tag == false ) return;
$extag_query = $_GET['extag'];
if ( !empty( $extag_query ) ) {
$extags = preg_split( '/[+\s]+/', $extag_query );
if ( !empty( $extags ) ) {
$tag__not_in = array();
foreach ( $extags as $extag ) {
$extag = get_term_by( 'slug', $extag, 'post_tag' )->term_id;
if ( !empty( $extag ) ) $tag__not_in[] = $extag;
}
$q->set( 'tag__not_in', $tag__not_in );
}
}
}
add_action('pre_get_posts', 'add_extag_query');
公式ディレクトリにプラグインなどがあれば、そちらを使用される方が良いかと思います。こういうのはありそうな気がします。