WordPressでプレビューページのURLをカスタマイズする
今回も小ネタです。
表題通り『WordPressでプレビューページのURLをカスタマイズする』方法ですが、WordPress コアにはそのためのフィルターフックが用意されているので、そちらを利用します。例えば、プレビューページのURLに wpnonce をパラメータに追加するとしましょう。
今回はいきなり結論を出します。コードは以下のようになります。 functions.php などに追加ください。
add_filter( 'preview_post_link', 'add_preview_nonce' );
function add_preview_nonce( $preview_link ) {
$nonce = wp_create_nonce( 'wp_nonce_action' );
$new_preview_link = add_query_arg( '_wpnonce', $nonce, $preview_link );
return $new_preview_link;
}
では簡単に解説を入れておきます。
preview_post_link
のリファレンスページによると、パラメータは2つ扱うことができます。一つが元のプレビューページURLで、もう一つが WP_Post オブジェクトです。ただし、add_filter
の第4引数 $accepted_args
を指定しないと WP_Post オブジェクトは受け取れません($accepted_args
の初期値が 1 なので)。今回はプレビューページURLだけで十分なので指定しません。
続けて preview_post_link
にフックするコールバック関数 add_preview_nonce
ですが、まず wp_create_nonce
で nonce を生成します (例なのでアクション名は wp_nonce_action
としていますが、実際には対応する nonce のアクション名を指定ください)。
「プレビューページURLを受け取るなら、そのURLを引数にして wp_nonce_url()
を実行すれば良いのでは?」と思った方、筋は良いですけど、それではうまく行きません。
よぉく思い出してほしいのですがプレビューページURLは preview=true
というGETパラメータを持っていて、wp_nonce_url()
は引数の URL に GETパラメータが含まれるか否かを考慮しないので、プレビューページURLに含まれる ?
と =
が URLエンコードされてしまいます。なので、上記のサンプルのように、
wp_create_nonce
で一旦 nonce を生成するadd_query_arg
で生成した nonce を追加する
という手順を採ります。で、その値を return してやればOKです。まぁ、今回のサンプルでは nonce を追加するって例なのでちょっとややこしくなりましたが。