スラッグを使ってリンクを貼る

以前の自作CMSでは、各記事のパス名がIDになっていて、IDさえ指定すれば、URLやタイトルを自動的にリンクにして張る、という機能を実装していました。WordPressだと各記事やページには数字のIDとは別に「スラッグ」という文字列があるらしいです。

昔の記事を移行するには、これを使うとよいと思ったのですが、スラッグからタイトルやURLを取得する関数が見つからなかったので、自分で作ってしまいました。データベースを直接見るのでかなり汚いコードですが。

まず、スラッグから記事を取得する関数です。

function effy_get_post_by_slug($slug)
{
  global $wpdb;
  $post_id = $wpdb->get_var(
    $wpdb->prepare("SELECT ID FROM ".$wpdb->posts.
    " WHERE post_name = %s".
    " AND post_type IN ('post','page')".
    " AND post_status = 'publish' LIMIT 1"
    , $slug));
  return $post_id ? get_post($post_id) : null;
}

で、これをショートコードで使えるようにします。ついでにスラッグだけではなく、ファイルへの参照も一緒にできるようにしました。ちなみにeffy_files_url()関数は、ファイルへのURLを返してくれる関数ですがこれは省略します。

function effy_link($atts,$content=null)
{
  extract(shortcode_atts(array(
      'path'   => '',
      'slug'   => '',
      'target' => '_blank',
      'text'    => ''
      ),$atts));

  $path = trim($path);
  $slug = trim($slug);

  if($slug) {
    $post = effy_get_post_by_slug($slug);
    if($post) {
      $permalink = get_permalink($post->ID);
      $title = $text=="" ? $post->post_title : $text;
      return "<a href='$permalink' target='$target'>$title</a>";
    }
    else {
      return "";
    }
  }
  else if($path) {
    if($text == '')
      $text = basename($path);

    $file_url = effy_files_url($path);
    return "<a href='$file_url' target='$target'>$text</a>";
  }
  else {
    return "";
  }
}
add_shortcode('link','effy_link');

これで、[link slug="20110106"]と書けばスラッグを使ってリンクを貼るとなるし、[link path="2009/02/digital-gino2.zip"]と書けばdigital-gino2.zipと自動的にリンクに置換されて、以前のコンテンツをほとんど手間をかけずに移行できました。