非公開記事の取り扱い

ワードプレス

一部記事を「会員のみ」に公開するようなサイトで使うかもしれないカスタマイズ例です。

「非公開:」の文言を変更

/* ---------- 文言「非公開:」を変更 ---------- */
function remove_page_title_prefix( $title = '' ) {
	if( empty( $title ) ){
		return $title;
	}
	$search = '/^' . str_replace('%s', '(.*)', preg_quote( __( 'Private: %s'), '/' ) ) . '$/';
	return preg_replace( $search, '会員限定:$1', $title );
}
add_filter( 'the_title', 'remove_page_title_prefix' );

元は「非公開:」の文言を削除するコードです。

そもそも非公開記事はログアウト状態では出力されないので文言を変えてもあまり意味ないですが、管理者、編集者用とかにすれば、管理上はわかりやすいかも。

参考:[WP]非公開記事のタイトルで「非公開:」の文字を表示しない方法

パスワード保護の「保護中:」を変更

こっちはもう少し需要があると思います。

/* ---------- 文言「保護中」を変更 ---------- */
function edit_protected_word (){
	return 'パスワードが必要です:%s';
}
add_filter( 'protected_title_format', 'edit_protected_word' );

非公開記事の閲覧権限を拡張する

非公開記事は、管理者権限と編集者権限でログイン中のみ出力されますが、他の権限でも閲覧できるようにしよう、というコードです。

「非公開 = 会員限定」にしたいケースでお手軽。

/* ---------- 非公開記事の閲覧権限を追加「購読者」 ---------- */
function add_read_private_subscriber(){
	$subscriber = get_role( 'subscriber' );
	$subscriber->add_cap( 'read_private_posts' );
}
add_action( 'admin_init', 'add_read_private_subscriber' );

/* ---------- 非公開記事の閲覧権限を追加「寄稿者」 ---------- */
function add_read_private_contributor(){
	$contributor = get_role( 'contributor' );
	$contributor->add_cap( 'read_private_posts' );
}
add_action( 'admin_init', 'add_read_private_contributor' );

/* ---------- 非公開記事の閲覧権限を追加「投稿者」 ---------- */
function add_read_private_author(){
	$author = get_role( 'author' );
	$author->add_cap( 'read_private_posts' );
}
add_action( 'admin_init', 'add_read_private_author' );

参考:https://eguweb.jp/wordpress/42554/

権限を元に戻す

上記コードを一度読み込むとデータベースに保存されますので、権限を削除したい場合は上記コードを削除したうえで、以下のコードをロードします。

/* ---------- 非公開記事の閲覧権限を削除「購読者」 ---------- */
function remove_read_private_subscriber(){
	$subscriber = get_role( 'subscriber' );
	$subscriber->remove_cap( 'read_private_posts' );
}
add_action( 'admin_init', 'remove_read_private_subscriber' );

/* ---------- 非公開記事の閲覧権限を削除「寄稿者」 ---------- */
function remove_read_private_contributor(){
	$contributor = get_role( 'contributor' );
	$contributor->remove_cap( 'read_private_posts' );
}
add_action( 'admin_init', 'remove_read_private_contributor' );

/* ---------- 非公開記事の閲覧権限を削除「投稿者」 ---------- */
function remove_read_private_author(){
	$author = get_role( 'author' );
	$author->remove_cap( 'read_private_posts' );
}
add_action( 'admin_init', 'remove_read_private_author' );

記事の公開状態によらないケース

「非公開 = 会員限定」にしてしまうと、本当に非公開にしたい場合、ステータスを「下書き」にするくらいしか思い当たりません。

これは結構不便。

 

すぐに思いつくのは、カスタムフィールドなどでフラグを立て、ループ中で条件分岐を行う方法。

if( カスタムフィールドなどの限定公開オプション:ON ){
	if( is_user_logged_in() ){
		echo '記事のループ用の内容';
	}
}else{
	echo '記事のループ用の内容';
}

※タグ、カテゴリー、ターム操作でも出来ると思いますが、面倒くさそう。

※「記事のループ用の内容」が、メインループ、各サブループで共通になってないと何か所も変える必要が出てきます。

※シングルにも同じような制御が必要です。

お手軽ゆえ

これなら、ログイン状態による制御と、公開・非公開による制御、両方が行えますが、
記事の総件数やページ送りがおかしくなる問題アリ。

 

ので、しっかりやるなら

  • サブループ:new WP_Query()の引数での操作
  • メインループ:add_action( ‘pre_get_posts’, ~ )での操作

などの改変で対応する必要があります。

 

ここまでやるなら「公開・非公開」を工夫した方が手間が少なさそうです。