当サイトには広告が含まれております

postidかスラッグからタイトルを取ってくるショートコードを作りました

この記事は最終更新日から9年経過しています。内容が古い可能性があります。

Image [2]

8Beatアドベントカレンダーを毎日更新しています。最初に作ったときはカレンダーの日付がリンクすればいいかと思ったのですが、記事が溜まってくると日付だけで無く、タイトルがあった方が便利だと思い始めました。
ということでpostidかスラッグからタイトルをタイトルを取ってくるショートコードを作ってタイトルが出るようにしてみました。

記事をざっと見る

修正前の8Beatカレンダーはどんなだったか?

アドベントカレンダーをWordPressとショートコードでサクッと作りました(^^)/

で作ったカレンダーはこんな感じでした。

Image

最初はよかったのですが記事が増えてくるとタイトルが出ていないとどんな記事があるか分からなくてもったいないなと思い始めました。

postidかスラッグからタイトルを取ってくるショートコード

ryus_get_post_title という名前のショートコードを作りました。

まずは使い方を紹介します。postidで指定するときは、

[ryus_get_post_title postid=5917]

のように postid=ポストID と指定します。すると、

[ryus_get_post_title postid=5917]

のように表示されます。この場合分かりやすいようにstyleでバックカラーと枠を付けています。

同じようにスラッグ指定で使うときは、

[ryus_get_post_title slug=meishiprinter]

のように slug=スラッグ を指定します。すると、

[ryus_get_post_title slug=meishiprinter]

このようにタイトルが出てきます。

タイトルを取るだけでなく、リンクもして欲しい場合はオプションで setlink=y とします。
上記の2つのリンクをリンクつきにするには

[ryus_get_post_title postid=5917 setlink=y]
[ryus_get_post_title slug=meishiprinter setlink=y]

このように書きます。すると、

[ryus_get_post_title postid=5917 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 postid=5917 setlink=y 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 という既に作ってある囲み型ショートコードの中に、今作ったショートコードでタイトルを表示しようと思いました。しかし、

Image [1]

このように(^_^;、ショートコードがそのまま表示されてしまいます。。ショートコードの中でショートコードを表示するにはとググってこちらを参考にさせていただきました。

ショートコードの中のショートコードを実行させるコード

$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');

このようにして、ちゃんと表示出来るようになりました。

Image [2]

こんな感じです。分かりやすくなった8Beatアドベントカレンダーを是非ご覧ください(^^)/

この記事が気に入ったら
いいね または フォローしてね!

あなたのシェアが励みになります!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントを残す

記事をざっと見る