ワードプレスで「下書きをプレビューする権限がありません」「404 Not Found」の原因は「Custom Permalinks」だった

今まで作ってきたワードプレスで出なかった症状を解決する

シェアする

初めて見たWordPressの「下書きをプレビューする権限がありません」

ワードプレスで「下書きをプレビューする権限がありません」「404 Not Found」の原因は「Custom Permalinks」だった初回の記事にも書いていたとおり、下書きプレビューができませんでした。

ワードプレスを触り始めて、独自テーマも作れるようになってきてそこそこ触れるようになっていました。

もともとWebデザインをしていたこともあって、
html
CSS
PHP
位はひと通りできるので、正直調子のってました。

では1つずつ切り分けして解決したので早速ご紹介。

ワードプレスのURL設定を確認

ワードプレスのURL設定を確認管理画面で「設定」→「一般設定」からURLを確認します。
ワードプレスのインストールディレクトリはいつも、
xxxxxx/wp
(xxxxxx部分はルートディレクトリ)
としているので設定が間違っていそうではありません。

ちなみに、インストールディレクトリと実際のURLを変える場合は直接phpのファイルをいじるので、今度ご説明します。

パーマリンク設定を確認

パーマリンク設定を確認投稿時にURLを設定したいので、「カスタム構造」にして「/%postname%」にしています。

こうすることで、自動で振られる記事IDのパラメータURLにならないので、
サイト構造の管理もしやすくなるし、SEO的にも良くなるでしょう。

で、そもそものエラーの切り分けとして、スペル間違いも無いしここも問題ありませんでした。

.htaccessの確認

カスタム構造にしているので、WordPressがしっかりと.htaccessを書いてくれます。
しかし、ここも確認してみましたが問題なし。

1
2
3
4
5
6
7
8
9
10
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

URLを自由に設定できるプラグインCustom Permalinksの確認

ここまで切り分けした結果を考えると、ワードプレス本体が行っている処理は問題なさそうです。

となると問題になりやすいのはプラグイン。
今まで使っていて問題なかったCustom Permalinksですが、少し怪しいので調べてみます。

まずプラグイン「custom-permalinks.php」の161行目あたりを見てみると、

1
2
3
4
5
6
7
8
if ( !$request ) return $query;
$sql = "SELECT $wpdb->posts.ID, $wpdb->postmeta.meta_value, $wpdb->posts.post_type FROM $wpdb->posts  ".
            "LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE ".
            "meta_key = 'custom_permalink' AND ".
            "meta_value != '' AND ".
            "( LOWER(meta_value) = LEFT(LOWER('".mysql_real_escape_string($request_noslash)."'), LENGTH(meta_value)) OR ".
            "LOWER(meta_value) = LEFT(LOWER('".mysql_real_escape_string($request_noslash."/")."'), LENGTH(meta_value)) ) ".
            "ORDER BY LENGTH(meta_value) DESC LIMIT 1";

とあります。
wp_postsの記事テーブルとwp_postmetaを記事IDでJOINしています。
ぐぐってみたところ、リビジョンを除外すれば良いとあったのでSQLで除外してみました。

1
2
3
4
5
6
7
8
9
if ( !$request ) return $query;
$sql = "SELECT $wpdb->posts.ID, $wpdb->postmeta.meta_value, $wpdb->posts.post_type FROM $wpdb->posts  ".
            "LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) WHERE ".
            "meta_key = 'custom_permalink' AND ".
            "meta_value != '' AND ".
            "post_type NOT IN (revision) AND ".
            "( LOWER(meta_value) = LEFT(LOWER('".mysql_real_escape_string($request_noslash)."'), LENGTH(meta_value)) OR ".
            "LOWER(meta_value) = LEFT(LOWER('".mysql_real_escape_string($request_noslash."/")."'), LENGTH(meta_value)) ) ".
            "ORDER BY LENGTH(meta_value) DESC LIMIT 1";

6行目に追記した部分。
post_typeカラムのrevisionを除外しているのが分かります。

で、早速再読み込み。

あれ!?今度は404になった。
そりゃそうだ。

下書きの場合、post_typeはrevisionになる。
じゃ、投稿済みのページはどうなったか確認すると問題なく表示されている。

ならば追記した6行目をコメントアウトして再読み込み。

プレビューは404。
投稿済みも404。

こりゃおかしい。

なのでコメントアウトした追加コードは削除して、プラグインそのままのコードに戻しておきます。

原因が見えてきた「404」と「下書きをプレビューする権限がありません」

しかし、なんとなく見えてきた。

最初、記事を非公開で編集していた時に発生した「下書きプレビューする権限がありません」だったので、
URLを設定した状態でゴミ箱にいれたのを思い出し、
phpMyAdminからwp_postmetaテーブルでmeta_keyに「%custom_permalink%」で検索すると、
meta_valueで同じURLが重複しているのを発見。

このまま削除してもいいのですが、ワードプレスはこの辺りどんな処理をするか気になったので、
投稿のゴミ箱を空にして、phpMyAdminを再描画してみるとちゃんとwp_postmetaの関連レコードが削除されました。
さすがよく出来ています、WordPress。

いよいよ、下書きプレビューの再読み込みと投稿済みページの再読み込み。

Custom Permalinksを使っていて404が出た場合はwp_postmetaのmeta_keyで「custom_permalink」を検索し重複したmeta_valueが無いか確認すること!

解決しましたねー!
たかがこんなことなのにっていう感じですが、何事もすぐに答えに辿り着きません。

可能性や仮説をたくさん立てながら、一つ一つ切り分けをして原因を探る。

こういうことの積み重ねがあるからこそ、振り返ってみると知識が増えて成長し、
結果、最短の道のりだったことが分かります。

同じ現象でお困りの方に1つの切り分けとして参考にしてもらえれば幸いです。

シェアする

為替レート