WordPressの投稿に対して「get_sample_permalink」を使って取得できる値を調べました

WordPressの投稿データを使っていろいろやりたい事が今日もありました。たぶん、明日もあるんだろうと思います。

今回やりたかったことは、これです。パーマリンク設定で「%postname%」を利用している場合、この「%postname%」の設定や値によって条件分岐をしたくなりました。

パーマリンク設定で「%postname%」を利用(一例です)

wpgetsamplepermalink09

「どうすれば条件分岐できるんだろ・・・」と思って調べたんですが、なんかできそうだな~と思って使ったのが「get_sample_permalink」でした。

今後も使うかもしれないので、「get_sample_permalink」を使うとどういった値が取得できるのかを調べました。

こんなことしたい方が私の他にいるのかどうかわかりませんが、機会がありましたらご参考ください。

投稿の編集画面で「get_sample_permalink」

さっそくやろう。「%postname%」を変更することで取得できる値も変わりそうな予感。なので、投稿の編集画面で「get_sample_permalink」を使って値を取得することにしました。

というわけで、以下の方法でやりました。

取得方法はこうやった

いろいろとやり方はあると思いますが、今回は下のようなコードをfunctions.phpファイルに追記して、投稿の編集画面に表示させました。

add_action( 'edit_form_after_title', 'table_editor' );
function table_editor(){
 global $post;
 echo '<pre>';
 var_dump(get_sample_permalink($post->ID));
 echo '</pre>';
}

コードがやっていること

「edit_form_after_title」のフックを使って、投稿の編集画面のエディターの上部に「get_sample_permalink」で取得した結果を表示する、っていうコードです。

「get_sample_permalink」は第1引数でidが必須なので、「$post->ID」を入れて表示中の投稿のIDを指定しています。

Hello world!の投稿で試しました

WordPressをインストールすると、サンプルとして「Hello world!」という投稿があると思います。この投稿でやってみましょう。

wpgetsamplepermalink01

さっそく投稿の編集画面を見ると・・・配列で以下の値が取得できました。

array(2) {
  [0]=>
  string(35) "http://local.wptest.com/%postname%/"
  [1]=>
  string(11) "hello-world"
}

「http://local.wptest.com/%postname%/」というのはパーマリンク設定そのままですね。

wpgetsamplepermalink09

「hello-world」は、タイトル下に表示されているパーマリンクの「%postname%」にあたる「hello-world」が取得できました。

wpgetsamplepermalink02

データベースには保存されているのかな?

wp_postsテーブルの「post_name」フィールドを見ると、「hello-world」が格納されていました。

新規投稿の場合はどうなるんだろう?

「Hello world!」は既存の投稿だったので、今度は新規投稿の場合で試しました。

新規投稿の場合では「get_sample_permalink」で以下のような値が取得できました。

array(2) {
  [0]=>
  string(31) "http://local.wptest.com/?p=1933"
  [1]=>
  string(0) ""
}

「http://local.wptest.com/?p=1933」の「1933」は投稿IDのようです。「%postname%」に当たる部分は、この時点では取得できていません。

ここで、タイトル名を入力。

wpgetsamplepermalink07

下書き保存をしました。パーマリンクが表示されました。「%postname%」も設定されています。

wpgetsamplepermalink13

この場合、「get_sample_permalink」の値が下のように変わりました。

array(2) {
  [0]=>
  string(35) "http://local.wptest.com/%postname%/"
  [1]=>
  string(35) "20150902のバトル結果と考察"
}

データベースには保存されているのかな?

新規投稿の場合、wp_postsテーブルの「post_name」フィールドは空欄でした。

この結果をまとめると

上の結果は下書きボタンを押さずに自動保存が行われた場合でも同じ結果でした。

ということは、下書きボタンを押すか自動保存が行われた状態だと「get_sample_permalink」の値が変化するってことですかね。(他の場合でもあるかも)

条件分岐に使えそう。

続いて、手動でパーマリンクの「%postname%」の部分を編集した場合を見てみましょう。

手動で「%postname%」を編集するとどうなる

今度はパーマリンクの「%postname%」を手動で変更します。下のように「20150902_battlelog」に変更して「OK」を押します。

wpgetsamplepermalink14

次に、下書きボタンを押して保存します。(「OK」を押しただけでは「%postname%」も元に戻り「wp_posts」テーブルにも保存されなかったです)

下書きボタンを押すと、「get_sample_permalink」で以下のような値が取得できました。

array(2) {
  [0]=>
  string(35) "http://local.wptest.com/%postname%/"
  [1]=>
  string(18) "20150902_battlelog"
}

変更を行った「%postname%」の「20150902_battlelog」が取得できました。

データベースには保存されているのかな?

ここでwp_postsテーブルの「post_name」フィールドを確認すると「20150902_battlelog」が格納されていました。

この結果をまとめると

上の結果は下書きボタンを押さずに自動保存が行われた場合でも同じ結果でした。

ということは、パーマリンクの「%postname%」を手動で変更して下書きボタンを押すか自動保存がされた場合は、データベースに「%postname%」が格納される、ということですかね。

「%postname%」を編集しなかった場合(「編集」「OK」ボタンを押したけど、「%postname%」は変更しなかった。つまり編集は未遂だった場合)では、データベースに「%postname%」は格納されませんでした。

おまけ:パーマリンク設定を数字ベースに変えてみよう

今度はパーマリンクを「数字ベース」に変更します。

wpgetsamplepermalink05

そして、「Hello world!」の投稿の編集画面を見ます。パーマリンクが変更されましたね。

wpgetsamplepermalink06

この変更に伴って、「get_sample_permalink」で以下の値が取得できました。

array(2) {
  [0]=>
  string(34) "http://local.wptest.com/archives/1"
  [1]=>
  string(11) "hello-world"
}

「hello-world」の値はそのままみたいですね。こうなるのか~。他のパーマリンク設定で試すとまた違った結果になるかもです。

まとめ

今回試したことは何てことはないものですが、記事にして表現するとけっこう長くなっちゃいましたね。

とりあえず、既存・新規投稿に対して上記のような操作をすると、「get_sample_permalink」で取得できる値が変化するのはわかりました。

また、データベースに「%postname%」が格納されるタイミングもわかりました。

この結果を使って実用性がありそうな条件分岐としては、

  • 「get_sample_permalink」で取得できる2つの値を利用して条件分岐
  • 「%postname%」を手動で変更したかどうかによって条件分岐

などに使えそうかな~という感じです。

今回は投稿について行いましたが、固定ページ、カスタム投稿タイプではどうなるんだろう。気になってきましたので、また機会を見つけて試してみようと思います。

以上、何かのご参考となりましたら幸いです。

著者:bouya Imamura