前提・実現したいこと
ワードプレスの固定ページの投稿画面から、記事一覧を投稿できるように、
ループに引数を持たせて、ショートコード化をしたいです。
ショートコード化したいソースコード
page.php
1<div class="post_items"> 2 <?php $args = array( 3 'post_type' => 'news', 4 'posts_per_page' => 8, 5 'meta_key' => 'news_cat', //カスタムフィールドのキー 6 'meta_value' => 'ldk', //カスタムフィールドの値 7 'meta_compare' => 'LIKE' 8 ); 9 $my_query = new WP_Query($args); 10 if ($my_query->have_posts()) : while ($my_query->have_posts()) : $my_query->the_post(); 11 ?> 12 <a class="post_item" href="<?php the_permalink(); ?>"> 13 <?php if (post_custom('news_pic')) : // 入力がある場合 14 ?> 15 <figure class="news_pic"> 16 <img src="<?php the_field('news_pic'); ?>" alt=""> 17 </figure> 18 <?php else : // 入力がない場合 19 ?> 20 <figure class="news_pic"> 21 <img src="<?php echo get_template_directory_uri(); ?>/assets/img/common/noimage.png" alt=""> 22 </figure> 23 24 <?php endif; ?> 25 <div class="news_info"> 26 <h3 class="news_title"> 27 <?php 28 if (mb_strlen($post->post_title, 'UTF-8') > 21) { 29 $title = mb_substr($post->post_title, 0, 21, 'UTF-8'); 30 echo $title . '……'; 31 } else { 32 echo $post->post_title; 33 } 34 ?> 35 </h3> 36 <p class="news_area"><?php the_field('news_area'); ?></p> 37 <ul class="news_cat"> 38 <?php 39 $obj = get_field_object('news_cat'); 40 $news_cat = $obj['value']; 41 foreach ($news_cat as $news_cat_name) { 42 echo '<li>', $news_cat_name, '</li>'; 43 } 44 ?> 45 </ul> 46 </div> 47 </a> 48 <?php endwhile; 49 endif; 50 wp_reset_postdata(); ?> 51</div>
試したこと
上記サイトを参考に下記のように実装してみたのですが、うまくいかず困っております。。。
functions.php
1if (!function_exists('display_result')) { 2 function display_result($atts) 3 { 4 global $post; 5 extract( 6 shortcode_atts( 7 array( 8 'result_post_type' => '', 9 'result_post_num' => '-1', 10 'result_meta_key' => '', 11 'result_meta_key' => '', 12 ), 13 $atts 14 ) 15 ); 16 if ($result_post_type != '') { 17 18 $my_query = new WP_Query(array( 19 'post_type' => $result_post_type, 20 'posts_per_page' => $result_post_num, 21 'meta_key' => $result_meta_key, //カスタムフィールドのキー 22 'meta_value' => $result_meta_key, //カスタムフィールドの値 23 'meta_compare' => 'LIKE', //'meta_value'のテスト演算子 24 )); 25 } 26 27 if ($my_query->have_posts()) : 28 while ($my_query->have_posts()) : 29 $my_query->the_post(); 30 31 <a class="post_item" href="<?php the_permalink(); ?>"> 32 <?php if (post_custom('news_pic')) : // 入力がある場合 33 ?> 34 <figure class="news_pic"> 35 <img src="<?php the_field('news_pic'); ?>" alt=""> 36 </figure> 37 <?php else : // 入力がない場合 38 ?> 39 <figure class="news_pic"> 40 <img src="<?php echo get_template_directory_uri(); ?>/assets/img/common/noimage.png" alt=""> 41 </figure> 42 43 <?php endif; ?> 44 <div class="news_info"> 45 <h3 class="news_title"> 46 <?php 47 if (mb_strlen($post->post_title, 'UTF-8') > 21) { 48 $title = mb_substr($post->post_title, 0, 21, 'UTF-8'); 49 echo $title . '……'; 50 } else { 51 echo $post->post_title; 52 } 53 ?> 54 </h3> 55 <p class="news_area"><?php the_field('news_area'); ?></p> 56 <ul class="news_cat"> 57 <?php 58 $obj = get_field_object('news_cat'); 59 $news_cat = $obj['value']; 60 foreach ($news_cat as $news_cat_name) { 61 echo '<li>', $news_cat_name, '</li>'; 62 } 63 ?> 64 </ul> 65 </div> 66</a> 67 68 69 endwhile; 70 endif; 71 72 wp_reset_query(); 73 } 74 add_shortcode('display_result', 'display_result'); 75}
追記12.4
回答にて出力バッファをご教授いただき、下記サイトを参考に実装をしてみました。
wordpress投稿記事でPHPを使う方法
すると、出力自体はできているのですが、
ループ中のカスタムフィールド 部分の出力がされず、
どこが悪いのでしょうか。。。
出力ショートコード↓
[get_tag_query result_meta_key=hogehoge meta_value=hoge result_post_type=news result_post_num=8]
functions.php↓
functions.php
1// Include ShortCode 2require(dirname(__FILE__) . '/template-parts/shortcode.php');
shotcode.php↓
shotcode.php
1<?php 2function get_tag_query_func($atts) 3{ 4 // 引数処理 5 extract(shortcode_atts(array( 6 'result_post_type' => '', 7 'result_post_num' => '-1', 8 'result_meta_key' => '', 9 'result_meta_value' => '', 10 ), $atts, 'get_tag_query')); 11 12 13 ob_start(); 14 // 投稿取得処理 15 $args = array( 16 'post_type' => $result_post_type, 17 'posts_per_page' => $result_post_num, 18 'meta_key' => $result_meta_key, //カスタムフィールドのキー 19 'meta_value' => $result_meta_value, //カスタムフィールドの値 20 'meta_compare' => 'LIKE', //'meta_value'のテスト演算子 21 ); 22 $tagPosts = get_posts($args); 23?> 24 <?php if ($tagPosts) : foreach ($tagPosts as $post) : setup_postdata($post); ?> 25 26 <a class="post_item" href="<?php the_permalink(); ?>"> 27 <?php if (post_custom('news_pic')) : // 入力がある場合 28 ?> 29 <figure class="news_pic"> 30 <img src="<?php the_field('news_pic'); ?>" alt=""> 31 </figure> 32 <?php else : // 入力がない場合 33 ?> 34 <figure class="news_pic"> 35 <img src="<?php echo get_template_directory_uri(); ?>/assets/img/common/noimage.png" alt=""> 36 </figure> 37 38 <?php endif; ?> 39 <div class="news_info"> 40 <h3 class="news_title"> 41 <?php 42 if (mb_strlen($post->post_title, 'UTF-8') > 21) { 43 $title = mb_substr($post->post_title, 0, 21, 'UTF-8'); 44 echo $title . '……'; 45 } else { 46 echo $post->post_title; 47 } 48 ?> 49 </h3> 50 <p class="news_area"><?php the_field('news_area'); ?></p> 51 <ul class="news_cat"> 52 <?php 53 $obj = get_field_object('news_cat'); 54 $news_cat = $obj['value']; 55 foreach ($news_cat as $news_cat_name) { 56 echo '<li>', $news_cat_name, '</li>'; 57 } 58 ?> 59 </ul> 60 </div> 61 </a> 62 <?php endforeach; 63 endif; ?> 64 <?php wp_reset_postdata(); ?> 65<?php 66 67 $output = ob_get_clean(); 68 return $output; 69} 70 71add_shortcode('get_tag_query', 'get_tag_query_func'); 72 73?>
phpの初学者でして、
調べてもなかなか解決ができず、質問をさせていいただきました。
ご存知の方がいらっしゃいましたら、ご教授いただけますと嬉しいです。
どうぞ、よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/04 06:09
2020/12/04 06:35
2020/12/04 10:40