8Beatアドベントカレンダーを毎日更新しています。最初に作ったときはカレンダーの日付がリンクすればいいかと思ったのですが、記事が溜まってくると日付だけで無く、タイトルがあった方が便利だと思い始めました。
ということでpostidかスラッグからタイトルをタイトルを取ってくるショートコードを作ってタイトルが出るようにしてみました。
修正前の8Beatカレンダーはどんなだったか?
アドベントカレンダーをWordPressとショートコードでサクッと作りました(^^)/
で作ったカレンダーはこんな感じでした。
最初はよかったのですが記事が増えてくるとタイトルが出ていないとどんな記事があるか分からなくてもったいないなと思い始めました。
postidかスラッグからタイトルを取ってくるショートコード
ryus_get_post_title という名前のショートコードを作りました。
まずは使い方を紹介します。postidで指定するときは、
[ryus_get_post_title postid=5917]
のように postid=ポストID と指定します。すると、
のように表示されます。この場合分かりやすいようにstyleでバックカラーと枠を付けています。
同じようにスラッグ指定で使うときは、
[ryus_get_post_title slug=meishiprinter]
のように slug=スラッグ を指定します。すると、
このようにタイトルが出てきます。
タイトルを取るだけでなく、リンクもして欲しい場合はオプションで setlink=y とします。
上記の2つのリンクをリンクつきにするには
[ryus_get_post_title postid=5917 setlink=y] [ryus_get_post_title slug=meishiprinter setlink=y]
このように書きます。すると、
[ryus_get_post_title slug=meishiprinter setlink=y]
このように記事へのリンクも表示されます。私はtarget=_blank指定が好きなのでこれをデフォルトとしていますが、blankで無くしたい場合は
[ryus_get_post_title postid=5917 setlink=y targetblank=n] [ryus_get_post_title slug=meishiprinter setlink=y targetblank=n]
のように targetblank=n と指定すると、
[ryus_get_post_title slug=meishiprinter setlink=y targetblank=n]
このように同じページでリンクするようになります。
作ったショートコード ryus_get_post_title はこちら。
ということで作ったショートコードはこれです。
/* POSTIDもしくはスラッグを指定して、そのPOSTのタイトルを取得する */ function ryus_get_post_title ( $atts ) { extract( shortcode_atts( array( 'postid' => '', 'slug' => '', 'setlink' => '', 'targetblank' => 'y', ), $atts ) ); // スラッグ指定の時、postidを取得する if($slug != ''){ $postid = url_to_postid(site_url().'/'.$slug); } if($postid != ''){ $post = get_post($postid); if($setlink == 'y'){ $link = get_permalink($postid); $target = ''; if($targetblank == 'y') { $target = ' target="_blank"'; } return '<a href="'.$link.'"'.$target.'>'.$post->post_title.'</a>'; } else { return $post->post_title; } } return ''; } add_shortcode('ryus_get_post_title', 'ryus_get_post_title');
お使いになる場合は使っている子テーマの functions.php に上記のコードをコピーペーストしてください。
8Beatアドベントカレンダーにタイトルを出すようにしてみる
ということでショートコードができあがりましたので8Beatアドベントカレンダーに使ってみます。
ソースの一部だけですがこんな感じで修正しました。
[ryus_show_when_published slug="advent1" alternative=1]<a href="/advent1/" target="_blank"><div style="line-height:16px;">12月1日[ryus_get_post_title slug=advent1] </div><div style="line-height:16px;">[ryus_get_post_title slug=advent1] </div></a>[/ryus_show_when_published]
ryus_show_when_published という既に作ってある囲み型ショートコードの中に、今作ったショートコードでタイトルを表示しようと思いました。しかし、
このように(^_^;、ショートコードがそのまま表示されてしまいます。。ショートコードの中でショートコードを表示するにはとググってこちらを参考にさせていただきました。
$content = do_shortcode( shortcode_unautop( $content ) ); //ショートコードの中にショート
それを追加した ryus_show_when_published がこちらになります。
// 別の記事が公開されていたら表示する /* 予約投稿とかの時、公開済み記事に「補足でこういうblog書きました」みたいに表示したいけど、予約なので投稿されるまでは見せたくない。といって公開されるまで待つと書き忘れる、という教訓から */ /* 2014/12/01追加 代替文字 alternative 記事が公開されていないときに表示したい文字列 */ /* 2014/12/19追加 中に書いたショートコードを実行する */ function ryus_show_when_published ( $atts, $content = null ) { extract( shortcode_atts( array( 'postid' => '', 'slug' => '', 'alternative' => '', ), $atts ) ); $content = do_shortcode( shortcode_unautop( $content ) ); // ショートコードの中でショートコードを実行する // スラッグ指定の時、postidを取得する if($slug != ''){ $postid = url_to_postid(site_url().'/'.$slug); } if($postid != ''){ $post = get_post($postid); if($post){ if($post->post_status == 'publish'){ return $content; } } } if($alternative != ''){ return $alternative; } return ''; } add_shortcode('ryus_show_when_published', 'ryus_show_when_published');
このようにして、ちゃんと表示出来るようになりました。
こんな感じです。分かりやすくなった8Beatアドベントカレンダーを是非ご覧ください(^^)/
コメント