以前の自作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と自動的にリンクに置換されて、以前のコンテンツをほとんど手間をかけずに移行できました。