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