ようこそのお運びで、厚く御礼申し上げます。
50日目です。今回は前回の記事へのリンクの複数バージョンです。
ショートコードを使って、複数のIDやスラッグを指定して、特定の記事へのリンク一覧を作成してみる
複数のIDやスラッグを「属性」で指定して、特定の記事へのリンクの一覧を表示するショートコードを作成します。
※前回の応用です。今回はクラス定義をしてます。
今回は前回とおなじく属性値を、記事のidを「id」、記事のスラッグを「slug」としてどちらか一つの属性値を書き、値を以下のように持たせます。
※カンマ区切りで複数のIDかスラッグを入力していきます。
※idとslugを両方書いた場合は、slug優先にします。
表示側には、指定した記事のリンク一覧が表示されるようになります。
まずは、functions.phpに書いてみます。
では、functions.phpに以下のコードを書きました。
//オブジェクト生成 new Paka3ShortCodePostLinks; //クラス定義 class Paka3ShortCodePostLinks{ public function __construct(){ //1.ショートコードを作成 add_shortcode('postLinks', array($this,'paka3_postLink')); //2.適用するCSSを定義 add_action('wp_head',array($this,'paka3_postLink_css')); } //################################# //ショートコード //################################# public function paka3_postLink($atts) { extract(shortcode_atts(array( 'id' => 0, 'slug' => "" ), $atts)); $ids = mb_split(",",$id); $slugs = mb_split(",",$slug); $str =""; //*slugからidを取得 if($slug){ foreach($slugs as $skey=>$sval){ $post_id=get_page_by_path($sval,OBJECT,"post")->ID; $page_id=get_page_by_path($sval,OBJECT,"page")->ID; //投稿記事or固定ページ $s_id = $post_id ? $post_id : $page_id; //id見つからなかったら、$idを入れる $id = $s_id ? $s_id : $id; //*値を取得 $post =get_post( $id ); if($post) $str .= $this->paka3_postLinkView($post); } }elseif($id){ foreach($ids as $ikey=>$id_val){ $post =get_post( $id_val ); if($post) $str .= $this->paka3_postLinkView($post); } } $str = $str ? "<div class='postLinks'>".$str."</div>": $str; return $str; } //####################### function paka3_postLinkView($post){ //*表示 $link = get_permalink($post->ID); $img_src = get_the_post_thumbnail( $post->ID,array(80,80),array('align'=>'left')); $img_src = $img_src ? $img_src : "<img src='".get_bloginfo('template_url')."/img/noimage.png' width=80 align=left />"; $contents = mb_strimwidth($post->post_content, 0, 70, "...","UTF-8"); $str =<<<EOS <div class="paka3_postLink"> <a href="{$link}"> {$img_src} <h4>{$post->post_title}</h4> <p>{$contents}</p><div></div> </a> </div> EOS; return $str; } //################################# //CSS //################################# function paka3_postLink_css($headers){ echo <<<EOS <style type="text/css"> div.postLinks{margin:5pt 0;} div.paka3_postLink{ border:1px solid #ccc; padding:2pt;margin:0px 5pt; margin-top:-1px; } div.paka3_postLink img{ margin-right:5pt; } div.paka3_postLink h4{ } div.paka3_postLink p{ font-size:9pt; line-height:100%; color:#999; } div.paka3_postLink div{ clear:left; } </style> EOS; } }
ポイントはどこ?
- 今回のクラス定義はこんな感じです。
//オブジェクト生成 new Paka3ShortCodePostLinks; //クラス定義 class Paka3ShortCodePostLinks{ public function __construct(){ //1.ショートコードの定義 //2.適用するCSSを定義(wp_headをフック) } public function paka3_postLink($atts) { //*1.ショートコードから「記事リンク」の作成 //属性値の取得・変換 //slugの場合の処理 //idの場合の処理 } function paka3_postLinkView($post){ //*一つの記事のリンク(HTML) return $str; } function paka3_postLink_css($headers){ //*2.スタイルシートの定義 } }
- コンストラクタで、ショートコードとCSSを定義
//1.ショートコードを作成 add_shortcode('postLinks', array($this,'paka3_postLink')); //2.適用するCSSを定義 add_action('wp_head',array($this,'paka3_postLink_css'));
- paka3_postLink関数でショートコードの処理を行います。
- 第一引数「$atts」にショートコードで指定した「属性(idやslug)」の値が入ります。shortcode_atts関数で、正当性をチェックしデフォルトも設定してしまいます。
(WordPressCodex:shortcode_attsを参照)extract(shortcode_atts(array( 'id' => 0, 'slug' => "" ), $atts));
- extractでシンボルテーブルにインポート、つまり属性(idやslug)は$idや$slugなど変数と同じようにあつかえます。
- 今回は複数なので、カンマ区切りの値を分割して配列に一度入れます。
$ids = mb_split(",",$id); $slugs = mb_split(",",$slug);
- 今回はslugに値があれば、それを優先して処理を行います。
if($slug){ foreach($slugs as $skey=>$sval){ $post_id=get_page_by_path($sval,OBJECT,"post")->ID; $page_id=get_page_by_path($sval,OBJECT,"page")->ID; //投稿記事or固定ページ $s_id = $post_id ? $post_id : $page_id; //id見つからなかったら、$idを入れる $id = $s_id ? $s_id : $id; //*値を取得 $post =get_post( $id ); if($post) $str .= $this->paka3_postLinkView($post); } }
- get_page_by_pathでslugから記事のidを取得します。投稿記事と固定ページから探すようにしています(WordPressCodex日本語版:get_page_by_pathを参照)。
(今回はカスタム投稿には対応していません) - get_postで記事を取得します。値が存在すれば、paka3_postLinkView関数に渡してhtmlを生成します。
//*値を取得 $post =get_post( $id ); if($post) $str .= $this->paka3_postLinkView($post);
- 値がIDの場合も同様の処理を行います。
foreach($ids as $ikey=>$id_val){ $post =get_post( $id_val ); if($post) $str .= $this->paka3_postLinkView($post); }
- ※paka3_postLinkView関数とpaka3_postLink_css関数についての説明は省略します。コードを確認してください。
- 後は記事の本文など、表示したい部分に記事本文内にショートコードを記入します。
1.記事idを属性に設定する場合2.スラッグを属性に設定する場合
※スラッグとidを両方書いた場合
この場合はスラッグが優先されます。
コードをプラグイン用のファイルにします
それではfunctions.phpに書いたコードを消して、
「paka3_shortCodePostLinks.php」というファイルを作成し、以下のコードを記入します。
このファイルを[wp-content]>「plugins」ディレクトリに入れ、管理画面で有効にして完了です。
今回のまとめ
今回は50日目でしたが、やっと半分ですがプログラムを書くことよりネタを考えることの方が難しいとあらためておもいました。一日でかけるコードってのもなかなかやっかいです(笑)ブログも書くので、そのバランスが難しいですね。きっと後で見直すことにはなりそうですが、それでもやってみましょう。