🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1363閲覧

【wordpress】引数を持ったループのショートコード化

kii.32

総合スコア67

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/12/02 03:16

編集2020/12/04 06:04

前提・実現したいこと

ワードプレスの固定ページの投稿画面から、記事一覧を投稿できるように、
ループに引数を持たせて、ショートコード化をしたいです。

ショートコード化したいソースコード

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の初学者でして、
調べてもなかなか解決ができず、質問をさせていいただきました。

ご存知の方がいらっしゃいましたら、ご教授いただけますと嬉しいです。

どうぞ、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ショートコードのコールバックは
出力するんじゃなくて文字列を返してください

テンプレートのコードを流用したい場合は
出力バッファを使うと楽です

php

1'result_meta_key' => '', 2'result_meta_key' => '', 34 5'result_meta_key' => '', 6'result_meta_value' => '', 7 8'meta_key' => $result_meta_key, //カスタムフィールドのキー 9'meta_value' => $result_meta_key, //カスタムフィールドの値 1011 12'meta_key' => $result_meta_key, //カスタムフィールドのキー 13'meta_value' => $result_meta_value, //カスタムフィールドの値

投稿2020/12/02 03:32

KazuhiroHatano

総合スコア7819

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kii.32

2020/12/04 06:09

ご連絡遅くなりまして申し訳ございません。 また、ご回答ありがとうございます。 出力バッファについて、知りませんでした! なんとか、調べて実装してみたのですが、 ループ中のカスタムフィールド 部分の出力がされませんでした。。。 こちらも調べても、中々わからず。。。 何度も申し訳ないですが、ご教授いただけますと幸いです。
kii.32

2020/12/04 10:40

ありがとうございます! もう少し調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問