トップへ戻る
BLOGS

WordPress POST情報を取得してまとめてウィジェットの登録を行う

WordPress POST情報を取得してまとめてウィジェットの登録を行う

さて今回は

タイトルだけだと分かりにくいので

やりたいことをまとめます

  • WordPressに登録されている投稿タイプの取得
  • 全ての投稿タイプから全てのタクソノミーを取得
  • 取得した情報をループして複数のウィジェットをまとめて登録
  • ただし通常の投稿はループしない

こんな条件を含む内容でやっていこうと思います。

早速答えのコードを投下します

さてここからは一つづつコードを紐解いて解説してみます

投稿タイプを取得してくる

$postTypes = get_post_types( array( 'public' => true ),'names' );

get_post_types( $args, $output, $operator )

WordPressCODEX

こちらの関数で投稿タイプを取得してきます

第二引数に’names’を指定することでアクティブになっている投稿タイプを全て取得します

第一引数は$argsでこちらは条件を絞り込むパラメータです

ここで返される’names’とは’singular_name’のことです

要素をforeachで回してタクソノミー情報を取得します

foreach ( $postTypes as $postType ) {
      $taxonomies = get_object_taxonomies( $postType, 'objects' );
   }

と、ここで「通常の投稿を除外する」ことを思い出しました、

if ( $postType === 'post') {
      continue;
  }

こうすることで通常の投稿タイプの場合はループ文をスキップすることが出来ます

次はタクソノミー情報を得る関数です

get_object_taxonomies( オブジェクト|文字列|配列, ‘$output形式’ )

これでタクソノミー情報を変数にすることが出来ました

※注記 先のget_post_types() での情報取得の際に$output引数をオブジェクトにして取得してもいけるかと思ったんですが、どういうわけかオブジェクトからはタクソノミー情報を取れませんでした

公式のCODEXには

配列|文字列|オブジェクト) (必須) 投稿タイプの名前、または一個の投稿オブジェクト(配列 posts の要素)初期値: なし

とあり、一個の投稿オブジェクトというのが引っかかります、、、

タクソノミー情報を更にループして情報取得

if ( $taxonomies ) {
 foreach ( $taxonomies as $taxonomy_slug => $taxonomy ) {
  $taxonomy_name = esc_html( $taxonomy->label );
  $postType_name = esc_html( get_post_type_object( $postType )->labels->name);

最初のif文で配列変数が存在しているか判定しています

その後foreach文で二重ループとしてキーと値を両方ループします

タクソノミーの名前はesc_html( $taxonomy->label )で取得できます

そして投稿タイプの名前も取得しておきます

get_post_type_object( $postType )は投稿タイプの名前から投稿タイプのオブジェクトを取得できます

オブジェクトにすることで->labels->nameとしてアクセスすることが出来ます

さて取得した情報で更にセットアップをします

 $sidebar_description = '';
 $sidebar_description = sprintf(
 'このウィジェット領域は、「%s」の%sコンテンツに表示されます。' ,$postType_name , $taxonomy_name );

ここでウィジェットに使用する説明文のフォーマットを作成しておきます

ここはPHP関数のsprintf()(読み方がわからない)を使用して変数にしましょう

フォーマットを作成するのに便利な関数で

第一引数の文字列の中の%sの部分が第二引数の文字列に置き換わります

つまりループしているので一周目は

このウィジェット領域は、「投稿タイプA」タクソノミーAコンテンツに表示されます。’となり、

二週目は%sの部分がBへと変わっていきます

それではいよいよウィジェットの作成関数を書いていきます

register_sidebar( array(
 'name' => sprintf( __( '%sサイドバー(%s)' ),$postType_name , $taxonomy_name),
 'id'   => $taxonomy_slug . '-side-widget-area',
 'description'   => $sidebar_description,
 'before_widget' => '<aside class="widget %2$s" id="%1$s">',
 'after_widget'  => '</aside>',
 'before_title'  => '<h1 class="widget-subSection-title">',
 'after_title'   => '</h1>',
)
);

さっきのsprintf()関数をまた使用します

‘name’ => sprintf( __( ‘%sサイドバー(%s)’ ),$postType_name , $taxonomy_name),とすることで

実際の出力結果は

「投稿タイプ名 サイドバー(タクソノミー名)」となります

ウィジェットに使用するIDは一意の名前であるためここではスラッグ名を使用します

‘id’ => $taxonomy_slug . ‘-side-widget-area’,

後はウィジェットの説明文になるdescriptionも渡してあげましょう

‘description’ => $sidebar_description,

これで全て問題なく表示することが出来ます

この方法のメリットとしては、例えば追加の投稿タイプを登録した際にも自動でウィジェットを追加できるということですね。

コメントをお待ちしております

お気軽にコメントをどうぞ。

CAPTCHA