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エンコードされてしまいます。なので、上記のサンプルのように、

  1. wp_create_nonce で一旦 nonce を生成する
  2. add_query_arg で生成した nonce を追加する

という手順を採ります。で、その値を return してやればOKです。まぁ、今回のサンプルでは nonce を追加するって例なのでちょっとややこしくなりましたが。