[WordPress]ショートコードで投稿IDやスラッグから記事の内部リンクを作成する

 2017.09.20  2017.09.28

サイト内の記事へのリンクを作成するとき、URLや記事タイトルをひとつひとつ貼り付けるのは面倒ですよね。 ショートコードを使えば、リンク先の記事の投稿IDやページスラッグを入力するだけでページへのリンクが簡単に作成できます。 リンク先の記事タイトルを変更した時も自動的にタイトル名が変更されるので、メンテナンス性も優れています。

ショートコードの基本的な使い方については、[WordPress]便利なショートコードの基本的な書き方と使い方をご覧ください。

サンプルコード

以下のコードをfunction.phpに書きます。必ずバックアップを取ってから作業しましょう!

function linkpage_func ( $atts ) {
    extract( shortcode_atts( array(
        'id' => '', //投稿ID
        'slug' => '', //ページスラッグ
    ), $atts ) );
    $my_url = home_url( '/' );
    if($slug){ //スラッグを指定したときに投稿IDを取得する
        $id = url_to_postid($my_url. $slug);
    }
    $link = get_permalink($id);
    $title = get_the_title($id); //投稿IDで指定した投稿のレコードをデータベースから取得
    return '<a href="'. $link .'"' .'>'. $title. '</a>';
}
add_shortcode('pagelink', 'linkpage_func');

このコードは、[pagelink]というショートコードを作成し、2つの属性「id」と「slug」を使えるようにします。

投稿ID(数字)を指定する場合は、[pagelink id=投稿ID]
ページのスラッグを指定する場合は、[pagelink slug="ページのスラッグ"]
とショートコードを書けば、下記のようなリンク付きのタイトル名が出力されます。
(この記事のリンクです)

[WordPress]ショートコードで投稿IDやスラッグから記事の内部リンクを作成する

解説

add_shortcodeでショートコードを登録する

function linkpage_func ( $atts ) {
    //ここにショートコードの中身を書く!
}
add_shortcode('pagelink', 'linkpage_func');

ショートコードを登録して使える状態にするのがこの部分です。
linkpage_func」が新しく作った関数名、
add_shortcode('pagelink', 'linkpage_func'); で「pagelink」というショートコードを作成します。

shortcode_attsで配列をセットする

extract( shortcode_atts( array(
        'id' => '', //投稿ID
        'slug' => '', //投稿スラッグ
    ), $atts ) );

shortcode_atts」はユーザーがショートコードで指定した属性($atts)を、予め定義した属性($defaults_array)と結合し、必要に応じてデフォルト値をセットするWordpressの関数です。

shortcode_attsのパラメーター

使用例
shortcode_atts( $defaults_array, $atts );
$defaults_array
(配列)(必須)属性の連想配列、または空文字列で、属性が省略された場合に表示させるデフォルト値です。
$atts
(配列)(必須)ユーザーがショートコードタグに指定した属性。
shortcode_atts() は、$defaults_array のキーを全て含み、$atts配列に値が存在すればその値を上書きした、正規化された配列を返します。

上記のサンプルコードでは、idとslugはデフォルトで空の状態になっていますが、例えば「id=1、slug=’somethig’」と指定されている状態で、ショートコード側でIDやスラッグを指定すると、ショートコードで指定した属性でデフォルト値が上書きされます。

extractで配列から変数を作成する

「extract」は、連想配列のキーを変数名、値を変数の値として、配列から変数を作成するPHP関数です。
配列のキー「id」が変数名「$id」に、「slug」が「$slug」として処理されます。

extractの例

$array_fruits = array(
    'orange'=>'オレンジ',
    'banana'=>'黄色',
    'grape'=>'紫'
);
extract($array_fruits);

上記を実行すると、配列は下記のように変数に展開されます。

$orange = 'オレンジ';
$banana = '黄色';
$grape = '紫';

リンク付きタイトルを作成する

    $my_url = home_url( '/' ); //サイトのURLを取得
    if($slug){ //スラッグの指定がある場合
        $id = url_to_postid($my_url. $slug); //記事URLで投稿IDを取得
    }
    $link = get_permalink($id); //投稿IDのパーマリンクを取得
    $title = get_the_title($id); //投稿IDの記事タイトル名を取得
    return '<a href="'. $link .'"' .'>'. $title. '</a>';

「home_url( ‘/’ );」でサイトのURLを取得し、$my_urlに代入します。引数に( ‘/’ )を指定すると、スラッシュを含めたURLが取得できます。$my_urlと$slug(ショートコードで指定する値)をくっ付ければ、記事URLの出来上がりです!

投稿IDから記事情報を取得するので、ショートコードでIDを指定する場合はその値が変数の$idに入ります。ショートコードでスラッグを指定する場合は、記事のURLから投稿IDを取得するWPの関数「url_to_postid」を使って投稿IDを$idに代入します。

$idが分かれば記事のリンクやタイトルも取得できるので、returnでHTMLを出力します。ここでは、echoではなくreturnを使うことが推奨されています。echoはすべてブラウザへ出力されますが、ページの適切な箇所に表示されないとのことです。

ボタンを押すだけでコードを呼び出してくれるプラグイン「AddQuicktag」を使って作成したショートコードを登録しておけば、さらに時間短縮できますよ!