解決の一歩手前です。
以下のサイトの解答の
url rewriting – Remove author prefix on WordPress – Stack Overflow
http://stackoverflow.com/questions/3629323/remove-author-prefix-on-wordpress
二番目のコードを参考にしました。
add_filter('author_link', 'no_author_base', 1000, 2);
function no_author_base($link, $author_id) {
$link_base = trailingslashit(get_option('home'));
$link = preg_replace("|^{$link_base}author/|", '', $link);
return $link_base . $link;
}
これを以下のように変更し
add_filter('author_link', 'no_author_base', 1000, 2);
function no_author_base($link, $author_id) {
// ?authorのURLがきたら
$link_base = trailingslashit(get_option('home'));
// サイトトップにスラッシュを付けてかえす
return $link_base . "404.php";
// 返されたものに404をつけ再度かえす
}
使用中のテーマの下のfunction.phpに追記しました。
動きとしましては
「http://WordPressのURL/?author=1」といわれたら「http://WordPressのURL/404.php」にとばします。
弱点としましては
入力されたユーザー番号がアカウントとして存在するものは404.phpへ移動します。
存在しないユーザー番号を入れられた場合はURLがそのままで404を表示します。
なので、総当りをされたら有効なユーザー番号は何番かはわかってしまいます。
そのユーザー番号が有効なのか無効なのかさえもわからないほうが良いかなと思っています。
この対応でも良いといえば良いのですがもう一声頑張ってみたいと思っています。
エレガントな解決方法がありましたら教えて頂けると幸いです。
先ほどの自己レスを書き終わった後に思いつきました。
「getでauthorまでは決め打ちなんだからその人たちを一括で面倒見れば存在してもしなくても同じ動作では?」
以下のサイトの
WP:特定のGETパラメータが渡されたら404を返す – 日々平穏
http://www.heion.net/web/wordpress/get404/
コードを参考にしました。
if($_GET["itemid"]){
header("HTTP/1.0 404 Not Found");
include '404.php';
exit;
}
これを以下のように変更し
if($_GET["author"]){
header("HTTP/1.0 404 Not Found");
include '404.php';
exit;
}
テーマの下のfunction.phpに追記しました。
対応方法としましてはWordPressぽくないといいますか、おしゃれじゃない気もしますが要望は満たせてます。
.htaccessでやってしまうとサーバ環境によっては有効化されてない場合もあります。
WordPressのシステム内で話を完結させたほうがのちのち良いかなと思ってます。
他に解決方法がありましたら教えて頂けると幸いです。
著者アーカイブが必要ないのでしたら、次のトピックの回答が参考になります。
フォーラム » 使い方全般 » URLに表示されるユーザー名を消したいです
> popup様
ご回答頂きありがとうございます。
以下の内容で試してみました。
add_filter( ‘author_rewrite_rules’, ‘__return_empty_array’ );
をfunctions.phpに追加。
管理画面でパーマリンク設定画面からなにも変更せずに「変更を保存」を押下
404は表示されるようになったのですがログイン名がURLにでてしまいました。
出来ましたらURLもID番号のままで表示してくれるとありがたいと思っています。
こんにちは、
テーマの、author.phpの先頭に
if ( ! is_user_logged_in() ) {
wp_redirect( home_url( '/index.php?error=404' ) );
exit;
}
でどうですか?
is_user_logged_in()
は、お好みで
> nobita様
ご回答頂きありがとうございます。
下準備:
add_filter( 'author_rewrite_rules', '__return_empty_array' );
をコメントアウトして
管理画面でパーマリンク設定画面からなにも変更せずに「変更を保存」を押下し投稿者アーカイブを生成致しました。
存在してない状態で確認したところログイン・ログアウト共にURLが表示されました。
使用中のテーマに「author.php」がなかったのでその中身を
(author.phpがないのでarchive.phpで表示している様子)
<html>
<?php
if ( ! is_user_logged_in() ) {
wp_redirect( home_url( '/404.php' ) );
exit;
}
?>
みーたーなー
</html>
としてみました。
検証内容は以下の通りです。
ログイン中で
http://WordPressのURL/?author=存在するユーザー番号と入力すると
http://WordPressのURL/author/該当アーカイブへ(みたなと表示)
http://WordPressのURL/?author=存在しないユーザー番号と入力すると
http://WordPressのURL/?author=存在しないユーザー番号で404
ログアウトした状態で
http://WordPressのURL/?author=存在するユーザー番号と入力すると
404.phpにへリダイレクトしました。
しかし、FireFoxのFirebugでネットのログを見ると
存在するユーザー番号のGETでステータス301
ユーザーIDのGETでステータス302
404.phpのGETでステータス404
となりました。
内部犯行はともかく、外部犯行は気がつけば分かるという感じでしょうか。
先の「author」決め打ちの場合は、FirebugでユーザーIDのログは出ませんでした。
is_user_logged_in()は初めて触ったので非常に面白かったです。
ありがとうございました。
フィルタの変更ではURLはそのままですね。失礼しました。
出来ましたらURLもID番号のままで表示してくれるとありがたいと思っています。
ユーザー名を知られたくないのですよね?
ID番号の有効・無効状態も知られたくないのでしたら、著者アーカイブをすべて無効にした方がいいと思います。
nobitaさんが紹介したwp_redirect()を使って、存在しないページにリダイレクトさせます。
function disable_author_archive() {
if( $_GET['author'] || preg_match('#^/author/.+#', $_SERVER['REQUEST_URI']) ){
wp_redirect( home_url( '/404notfoud' ) );
exit;
}
}
add_action('init', 'disable_author_archive');
> popup様
ご回答頂きありがとうございます。
Firebugのログも
存在するユーザー番号のGETでステータス302
404.phpのGETでステータス404
となっていたので安心です。
正規表現が「#^/author/.+#」となっていましたが
「#/author/.+#」かなと思い以下のように致しました。
/*
投稿者アーカイブ非表示化
設置方法:
テーマのfunction.phpに以下の処理を書き込む
有効化方法:
書き込み後、パーマリンク設定を何も変更せず「変更を保存」を押下する。
*/
//投稿者アーカイブを空欄化
add_filter( 'author_rewrite_rules', '__return_empty_array' );
//URLを非表示化
function disable_author_archive() {
if( $_GET['author'] || preg_match('#/author/.+#', $_SERVER['REQUEST_URI']) ){
wp_redirect( home_url( '/404.php' ) );
exit;
}
}
add_action('init', 'disable_author_archive');
WordPressっぽい書き方で、私の発想より非常にカッコイイです。
ありがとうございました。
解決とさせて頂きます。