WordPress Popular Postsのサムネイルの出力についての質問です。
長くなりますが宜しくお願い致します。
前提・実現したいこと
Wordpressのサイドバーに人気記事を表示する為、WordPress Popular Postsというプラグインを使用しております。
その上でサムネイルを表示させる方法を以下の方法でカスタマイズしております。
表示させたい順番としては、
- アイキャッチに指定したサムネイル
- YouTubeが本文に埋め込まれている場合はYouTubeを表紙にした画像
- キャラリー画像が埋め込まれている場合はギャラリー最初の画像
- なければコンテンツ本文内の最初の画像
- なければAdvanced Custom Fieldsで設定したカテゴリー画像
- なければAdvanced Custom Fieldsで設定したBlogデフォルト画像
- 最後にそれもなければNo image画像を表示。
この順番で画像を表示させたいのですが、コンテンツ本文内の最初の画像とギャラリーの最初の画像YouTubeの画像を表示する事が出来ません。
以下のコードをfunctions.phpに記述しております。
function my_custom_single_popular_post( $post_html, $p, $instance ){
$size = 'wpp-thumbnail';
$blog_cover_image = get_field('blog_cover_image','option');//カスタムフィールド
$title = get_the_title( $post->ID );
//最初の画像を取得してIDを取得
$first_list = '';
ob_start();
ob_end_clean();
preg_match_all("/<img[^>]+src=[\"'](s?https?:\/\/[\-_\.!~\*'()a-z0-9;\/\?:@&=\+\$,%#]+\.(jpg|jpeg|png|gif))[\"'][^>]+>/i", $post->post_content, $matches);
//カテゴリのデフォルト画像を探す
$taxonomy_names = get_post_taxonomies($p->id);
if(!empty($taxonomy_names[0])) {
$cats = get_the_terms($p->id, $taxonomy_names[0]);
foreach((array)$cats as $cat) {
if(!empty($cats[0])) {
$cat_id = $cat->term_id;
$attachment_id = get_field('category-image', 'category_' . $cat_id);
if(!empty($attachment_id)) break;//カテゴリ画像見つけたらループ終了
}
}
}
//Youtubeの画像を探す
$youtubePost = $post->post_content;
preg_match('/www.youtube.[-_\/A-Za-z0-9]*/', $youtubePost, $youtubeUrl);
preg_match('/www.youtube.[-_?=\/A-Za-z0-9]*/', $youtubePost, $pasteUrl);
preg_match('/youtu.be.[-_?=\/A-Za-z0-9]*/', $youtubePost, $beUrl);
//ギャラリーショートコードの最初の画像を探す
$pattern = get_shortcode_regex();
$id = absint( $p->id );
if ( empty( $id ) ) {
$id = absint( $post->ID );
$text = $post->post_content;
} else {
$text = get_post( $id );
$text = $text->post_content;
}
if (has_post_thumbnail($p->id)){//投稿にサムネイルがある場合の処理
$thumb_id = get_post_thumbnail_id($p->id);
$thumb_array = wp_get_attachment_image_src( $thumb_id, $size);
$thumb = '<img src="'.$thumb_array[0].'" alt="'.$p->title.'">';
} else if (isset($youtubeUrl[0])){//Youtube画像がある場合の処理
if (preg_match('/embed/', $youtubeUrl[0])) {
$youtubeId = str_replace("www.youtube.com/embed/","",$youtubeUrl[0]);
$thumb = '<img src="//img.youtube.com/vi/'.$youtubeId.'/0.jpg" class="image-trimming">';
} else if (preg_match('/watch/', $pasteUrl[0])) {
$pasteId = str_replace("www.youtube.com/watch?v=","",$pasteUrl[0]);
$thumb = "<img src='//img.youtube.com/vi/$pasteId/0.jpg' class='image-trimming'>";
}
} else if (isset($beUrl[0])){
if (preg_match('/youtu.be/',$beUrl[0])) {
$beId = str_replace("youtu.be/","",$beUrl[0]);
$thumb = "<img src='//img.youtube.com/vi/$beId/0.jpg' class='image-trimming'>";
}
} else//ギャラリーの画像があれば分岐
if ( preg_match( '/' . $pattern . '/s', $text, $matches ) && 'gallery' == $matches[ 2 ] ) {
if ( preg_match( '!ids=(\'|")([0-9,]+)(\'|")!', $matches[ 3 ], $regs ) ) {
$thumb_array = wp_get_attachment_image( $regs[ 2 ] ,$size);
$thumb = '<img src="'.$thumb_array[0].'" alt="'.$p->title.'">';
}
} else if(!empty($first_list)) {//本文に最初の画像があれば分岐
//最初の画像IDからサムネイルのパスを取得してセット
if(isset($matches[1][0])){
$first_list = ($matches[1][0]);
$thumb_array = wp_get_attachment_image_src( $first_list,$size ,false);
$thumb = '<img src="'.$thumb_array[0].'" alt="'.$p->$title.'">';
}
} else if(!empty($attachment_id)) {//サムネイルがないのでデフォルトカテゴリ画像を表示
$thumb = wp_get_attachment_image($attachment_id,$size,false);
$thumb = preg_replace( '/(width|height|srcset|sizes)="(.*?)"\s/', '', $thumb );
} else if( !empty($blog_cover_image)){
$thumb_array = wp_get_attachment_image_src( $blog_cover_image ,$size ,false);
$thumb = '<img src="'.$thumb_array[0].'" alt="'.$p->$title.'">';
} else if(empty($img_id)){//上記条件の画像がない場合はデフォルト画像を表示
$default = get_field('default_image','option');//カスタムフィールド
$img_id = $default;
$thumb_array = wp_get_attachment_image_src( $default ,$size ,false);
$thumb = '<img src="'.$thumb_array[0].'" alt="'.$p->title.'">';
}
$output = '<li><div class="wpp-img"><a href="' . get_the_permalink($p->id) . '">' . $thumb . '</a><p class="wpp-post-title"><a href="' . get_the_permalink($p->id) . '">' . $p->title . '</a></p></div></li>';
return $output;
}
if ( !is_admin() ) add_filter( 'wpp_post', 'my_custom_single_popular_post', 10, 3 );//管理画面では除外
[使用環境]
Wordpress Version:v5.2.3
WordPress Popular Posts:v4.2.2
Advanced Custom Fields PRO:v5.8.2
PHP version:v7.2.17
サーバー:エックスサーバー
参考にしたサイト : https://www.doe.co.jp/hp-tips/wordpress/wpp-customize/
大変長くなりましたが以上、ご教授宜しくお願い致します。