僕の状況
僕のブログの一つで、最近はじめたものがあって、それが、結構ディープなことを書いています。
批評系だったり、アダルチックなことだったり、日常のことだったり、様々です。
で、まぁまず、そういう記事っていうのはやはり、いきなり一般に見せちゃいけないと思うんです。
じゃあどうするかって、例えば、”本当にこの記事を閲覧しますか?気分を害する恐れがあります”みたいなポップアップを出すとか、
記事一覧から該当する記事を隠すとか、でも完璧に見れないんじゃだめだから、クエリパラメータで見れるようにするとか、
そういう記事は見せないだけじゃなくてGoogle評価も下げかねないので、noindexにするとか、ね。
そういう機能を、ここでは実装していきます。
記事一覧から隠れた記事の記事カテゴリの設定をURLクエリパラメータによって無効化
functions.php
function exclude_category_black(){
function exclude_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-4' ); // category: black
}
}
add_action( 'pre_get_posts', 'exclude_category' );
}
if (isset($_GET['black'])) {
if ($_GET['black'] == "true") {
// echo "1" ;
// trueの場合にのみ非表示処理しない
} else {
exclude_category_black() ;
}
} else {
exclude_category_black() ;
}
はい、これで、&black=true
がある場合にのみ当該のカテゴリの記事を記事一覧に含みます。
http://yuis.org/blog/?page_id=23&black=true
のような感じ。
で、次に2カテゴリこれをする場合なんですが…。
function exclude_category_black_bundle(){
function exclude_category_black( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-4' ); // category: black
}
}
add_action( 'pre_get_posts', 'exclude_category_black' );
}
if (isset($_GET['black'])) {
if ($_GET['black'] == "true") {
// echo "1" ;
// trueの場合にのみ非表示処理しない
} else {
exclude_category_black_bundle() ;
}
} else {
exclude_category_black_bundle() ;
}
function exclude_category_pink_bundle(){
function exclude_category_pink( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-3' ); // category: pink
}
}
add_action( 'pre_get_posts', 'exclude_category_pink' );
}
if (isset($_GET['pink'])) {
if ($_GET['pink'] == "true") {
// echo "1" ;
// trueの場合にのみ非表示処理しない
} else {
exclude_category_pink_bundle() ;
}
} else {
exclude_category_pink_bundle() ;
}
これでできるはずなんですけど、add_actionが原因なのかな、2つのうち最後の1つしか動作しません。最後に定義されたものが優先されているってところでしょうか。
なんで、クエリストリング2つに分けるっていうのは、無理っぽいです。
なので、まとめて、
function exclude_category_bundle(){
function exclude_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-4,-3' ); // category: black and pink
}
}
add_action( 'pre_get_posts', 'exclude_category' );
}
if (isset($_GET['black'])) {
if ($_GET['black'] == "true") {
// echo "1" ;
// trueの場合にのみ非表示処理しない
} else {
exclude_category_bundle() ;
}
} else {
exclude_category_bundle() ;
}
ってするのがいいかなとおもいます。
ボタンで切り替えられるようにする
URLを直接変えるしかフィルタリング解除の方法がないんじゃアレなので、リンクを用意します。
<?php if (is_home()) {
echo '<a title="デフォルトで非表示になっている記事を表示します。気分を害する恐れがありますことをご了承の上ご閲覧ください。" style=" position: absolute; right: 8em; " onclick="window.location = document.location.href + \'&black=true\'">非表示の記事を表示</a>' ;
}
?>
こんな感じ。
これを、まぁナビゲーションメニューとかヘッダーメニューとかに置いて置けばいいかと思います。
CSSは僕仕様なので、適時変えてください。
ナビゲーションメニューの上にうまく設定する方法やらは、HTMLとCSSのお話だと思うので割愛します。テーマによっても違いますし。
続き:
wordpress: 特定カテゴリのすべての記事をnofollow/noindexする
WordPress PHP 特定カテゴリの記事に初回のアクセスがあった場合に警告する