WordPressで非公開ページに「非公開:」と付くのを防ぐ方法

WordPressでは、会員のみ公開したいページを「非公開」というステータスで制作することができます。

ただし、非公開のページはタイトルに自動的に「非公開:」というラベルが付加されてしまい、これは設定などでは外すことができないようです。

そこで、プログラムを使ってこれを取り除く方法を紹介しましょう。

functions.phpで制御しよう

お使いのテーマフォルダの中を確認しましょう。

wp-content/themes/(テーマ名)

ここに、「functions.php」というファイルがあります。もしなければ、この名前で新しいファイルを作成しましょう。

そしたら、ファイルの最後に次のように追記します。

add_filter('the_title', function ($title = '') {
    $search[0] = '/^' . str_replace('%s', '(.*)', preg_quote(__('Protected: %s'), '/')) . '$/';
    $search[1] = '/^' . str_replace('%s', '(.*)', preg_quote(__('Private: %s'), '/')) . '$/';
    return preg_replace($search, '$1', $title);
});

これでサイトを表示すると、タイトルが変化して表示されなくなります。

プログラム内容を確認しよう

それでは、書いたプログラムの内容を確認しましょう。ここでは、「正規表現」という方法を使って書き換えています。WordPressでは非公開ページを表示するときに、タイトルに「非公開:」という文言が付加された状態で生成されます。

そこで、これを「フィルターフック」というしくみを使って取り除いてから、タイトルとして生成するように変更します。ここでは「add_filter」で「the_title」というフィルターを書き換えましょう。

実際にタイトルを書き換えるのは、以下の部分です。

$search[0] = '/^' . str_replace('%s', '(.*)', preg_quote(__('Private: %s'), '/')) . '$/';

ただ、このプログラムは実はある理由から少し複雑になっています。もし、日本語専用のWebサイトの場合、このプログラムは次のように書き換えられます。

$title = str_replace('非公開:', '', $title);

これでも正しく動作します。しかし、WordPressは多言語対応がされている為、このままでは英語版のサイトなどにしたときに、正しく書き換えられません。そこで、本来の英文である「Private:」というラベルを多言語対応した状態で書き換える必要があります。それが「__()」というファンクションです。

これに沿って開発しようとすると、やらなければならない処理がどんどん増えて、正規表現のエスケープ処理である「preg_quote」を行ったり、「%s」の記述をこちらも正規表現の記述である「(.*)」に置き換えるなど、各種正規表現の為の対処をしています。このあたりは、詳しい解説は省略するので、興味があれば正規表現を学んでみてください。

ひとまず、こちらの方法で対応できます。functions.phpが書き換えられないとか書き換えるのが怖いという場合のために、プラグイン形式でアップロード可能なファイルも配置いたします。プラグインのアップロードからご利用ください。