ショートコードでカスタム投稿一覧を呼び出す。ターム、n番目など細かく制御

ワードプレスのメモ

カスタムフィールド中に突然、

「ある投稿タイプの最新記事を1件だす。」

「別のフィールドに、ある投稿タイプの2番目に新しい記事を1件だす。」

ということが必要になり、

「まぁ、これはショートコードで処理するのが簡単かな。」と思い、作ってみました。

関数

※2019/07/28

  • 日付とサムネールをオプションでオンオフできるように
  • ループコンテナにidとclassを命名できるように

変更しました。

 

※2019/09/20

タグを出力可能にしました。

 

//ショートコード - サブループ呼び出し
function show_subloop( $atts ){
	global $post;
	$sentence = '';
	extract( shortcode_atts( array(
		'post_type' => 'post', //デフォルト投稿タイプ
//		'tax' => '',
//		'term' => '',
		'show' => 4, //デフォルト表示件数
		'offset' => 0 //n番目から出力
	), $atts ) );

//ID
if( !empty( $atts['id'] ) ){
	$id = ' id="' . $atts['id'] . '"';
}else{
	$id = '';
}

//クラス
if( !empty( $atts['class'] ) ){
	$class = ' ' . $atts['class'];
}else{
	$class = '';
}

if( !empty( $atts['tax'] ) && !empty( $atts['term'] ) ){
	$args = array(
		'post_type' => $post_type,
		'tax_query' => array(
			array(
				'taxonomy' => $atts['tax'],
				'field'  => 'slug',
				'terms'  => $atts['term'],
			),
		),
		'posts_per_page' => $show,
		'offset' => $offset
	 );
	$shortcode_posts = get_posts( $args );
}else{
	$args = array(
		'post_type' => $post_type,
		'posts_per_page' => $show,
		'offset' => $offset
	 );
	$shortcode_posts = get_posts( $args );
}
	if( $shortcode_posts ){
		$sentence .= '<div' . $id . ' class="shortcode-loop shortcode-loop-' . $post_type . $class . '">' . "\n";
		foreach ( $shortcode_posts as $post){
			setup_postdata( $post );

//日付
if( $atts['date'] == 'false' ){
	$date = '';
}else{
	$date = get_the_date();
}

//サムネール
if( has_post_thumbnail() && !post_password_required() ){
	$image_url = get_the_post_thumbnail_url( get_the_ID(), 'medium' );
}else{
	$image_url = get_stylesheet_directory_uri() . '/images/thumbnail-default-medium.png';
}
$image_style = ' style="background-image: url( '.$image_url.' );"';
if( $atts['thumbnail'] == 'false' ){
	$thumbnail = '';
}else{
	$thumbnail = '<div class="shortcode-article-thumbnail"' . $image_style . '></div>';
}

			$sentence .= '<a class="link-shortcode-article" href="' . get_permalink() . '"><div id="post-'.get_the_ID().'" class="shortcode-article">' . $thumbnail . '<div class="shortcode-article-content"><div class="shortcode-article-title">' . get_the_title() . '</div><div class="shortcode-article-date">' . $date . '</div><div class="shortcode-article-body">' . mb_strimwidth( strip_tags( $post->post_content ), 0, 92, '', 'UTF-8' ) . '</div></div></div></a>' . "\n";
		}
		$sentence .= '</div>' . "\n";
	}
	wp_reset_postdata( );
	return $sentence;
}
add_shortcode( 'showsubloop', 'show_subloop' );

色々書いてますが、

tax、termを指定しない場合、条件分岐で抽出条件を分けないとNGです。

標準投稿みたいにデフォルト(カテゴリー = category 、未分類id = 1)があるわけじゃないので。

出力内容

要約は、「get_the_excerpt」では出ない模様。

↓こんな感じでで出ました。

mb_strimwidth( strip_tags( $post->post_content ), 0, 92, '', 'UTF-8' )

文字数とかは適当です。はまりやすいので。

実際の呼び出し例

デフォルト(標準投稿、絞り込みナシ、最新記事から4つ、日付、サムネールあり)

「showsubloop」

標準投稿、最新1件、日付なし、サムネールなし

「showsubloop show=”1″ date=”false” thumbnail=”false”」

カスタム投稿をタームで絞り込み、2番目だけ

「showsubloop post_type=”news” tax=”news_cat” term=”breaking” show=”1″ offset=”1″」

show=”-1″(全部出す)の場合、オフセットは無効になります。

きっと、ページングのことを考えて作られた機能だからでしょう。

▼実際に貼り付けると▼

「showsubloop tax=”category” term=”gadgets” show=”2″ offset=”1″ id=”gadget-pickup” class=”pickup”」

 

 

▲ガジェットカテゴリ記事を2つ、2番目に新しい記事から、id「gadget-pickup」class「pickup」として表示できました。▲

 

サムネールの有り無しなどもオプションにすれば色々使えそうです。

2019/07/28

  • 写真がほとんどないブログを書いているところも多いのでオプションで消せるように。
  • 日付があると困るケースも多々あるのでこれも出力しないオプションを追加。
  • このサブループブロックに遷移させたい!というケースもままあるのでidを設定出来るように。
  • 場所場所でデザインが変わる想定も結構あるので、任意にclassを加えられるように。

考え始めるとキリがないですが、実際にオプションはいくらでもつけられるので、サブループの呼び出しはこれで済ますケースも増えそう。

 

ただ、カスタムフィールドを読み込んだり、タグリストを条件指定して表示させたり、などは処理が大変そう。ほどほどに。

標準投稿用のソースをありがたく参考にさせていただきました。

WordPressで投稿内に指定カテゴリーの記事を表示するショートコード

追記:タグも出力

上記例だと、サムネールの後が下記のように変わります。(htmlは環境に合わせて何でも)

19行目「$tags = ”;」を入れてリセットしないと、タグが次々に加算されてしまうので注意です。

//タグ
$taxonomies = get_the_taxonomies();
if( !empty( $taxonomies ) ){
	$tags .= '<p class="taglist">';
	$count=1;
	foreach ( $taxonomies as $tax => $value ){
	    $tags .= '<span class="taglist-tax taglist-' . $tax . ' tax-order-' . $count . '">';
		$terms = wp_get_object_terms( $post->ID, $tax );
		foreach ( $terms as $term ){
			$tags .= '<a href="' . get_term_link( $term ) . '" class="taglist-term taglist-term-' . esc_html( $term->slug ) . '">' . $term->name . '</a>';
		}
		$tags .= '</span>';
	$count++;
	}
	$tags .= '</p>';
}

			$sentence .= '<article id="post-'.get_the_ID().'" class="shortcode-article">' . $thumbnail . '<div class="loop-content"><h2 class="entry-title post-title">' . '<a class="link-shortcode-title" href="' . get_permalink() . '">' . get_the_title() . '</a>' . '</h2>' . $tags . '<p class="date">' . $date . '</p><div class="entry-content entry-body excerpt-container">' . $excerpt . '</div></div></article>' . "\n";
			$tags = '';
		}
		$sentence .= '</div>' . "\n";
	}
	wp_reset_postdata( );
	return $sentence;
}
add_shortcode( 'showsubloop', 'show_subloop' );