質問するログイン新規登録
WordPress

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

Q&A

解決済

2回答

3589閲覧

WordPress:ACFのラジオボタンの選択肢で指定した値を除外した記事一覧を表示したい

pastoral

総合スコア10

WordPress

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

0グッド

0クリップ

投稿2019/04/10 08:59

編集2019/04/11 02:08

0

0

前提・実現したいこと

ACF(Advanced Custom Fields)で

■フィールド名:radio
■タイプ:ラジオボタン
■選択肢:none:なし/new:新着/soldout:売り切れ
■返り値:ラベル

を作成しました。

WordPressの「設定->表示設定->1ページに表示する最大投稿数」を20件に設定しています。
投稿した記事の25件中4件は選択肢が「soldout」となっています。

発生している問題・エラーメッセージ

archive.phpで、
フィールド名「radio」の選択肢が「soldout」となっている記事以外を表示したいのですが、
1ページに表示する最大投稿数に達する前に次のページへの切り替えとなってしまいます。
※16記事を表示で終わってしまう。

どうすれば「soldout」となっている記事を除外して最大投稿数の20件表示になるが教えていただけますでしょうか?どうぞよろしくお願いいたします。

該当のソースコード

<?php while ( have_posts() ) : the_post(); ?> <?php if(get_post_meta($post->ID,'up_icon',true) == 'soldout'): ?>
<?php $ads_infeed_count++;?>
<?php else:?>

     <a href="<?php the_permalink() ?>" class="btn-open1">詳細表示</a>

<?php $ads_infeed_count++;?>
<?php endif; ?>
<?php endwhile; ?>

補足情報

WordPress Version : 5.1.1
PHP Version : 7.1.15
server : CPI

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

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

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

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

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

guest

回答2

0

archive.php で、検索条件を特に設定していないので、20件検索されますが、while ( have_posts()) ループの中で、if で、表示しない内容を選択しているので、20 から if の条件と一致した件数を減じた件数をしか表示されません。


検索時にパラメータを与えて、除外するようにする必要があります。
例えば...

$args = array( 'meta_key' => 'up_icon', 'meta_value' => 'soldout', 'meta_compare' => '!=' ); $the_query = new WP_Query( $args ); // The Loop if ( $the_query->have_posts() ) { echo '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '<li>' . get_the_title() . '</li>'; } echo '</ul>'; /* Restore original Post Data */ wp_reset_postdata(); } else { // no posts found }

のような感じで...

関数リファレンス/WP_Query 参照。


別解

functions.php で、pre_get_posts を使う方法。

function my_pre_get_posts_273341($query) { if ( is_admin() || ! $query->is_main_query() ){ return; } if ( is_archive() ){ $query->set( 'meta_query', array( array( 'key' => 'up_icon', 'value' => 'soldout', 'compare' => '!=' )) ); } } add_action( 'pre_get_posts', 'my_pre_get_posts_273341' );

投稿2019/04/10 10:02

編集2019/04/10 11:41
CHERRY

総合スコア25234

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

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

marlboro_tata

2019/04/10 11:27

横から失礼致します。 pre_get_posts の方はもしかしたら、配列を入れ子に書く必要があるかもしれません。
CHERRY

2019/04/10 11:43

指摘ありがとございます。 確かに必要ですね。修正しました。
pastoral

2019/04/11 01:38

ご回答有り難うございます。 1番目の方法で試したところ、記事が一つも表示されず真っ白になってしまいました。 私の知識不足のため、記述が間違っているのだと思うのですが、何処か違うのが解りません。 <?php $args = array( 'meta_key' => 'up_icon', 'meta_value' => 'soldout', 'meta_compare' => '!=' ); $the_query = new WP_Query( $args ); ?> <?php if ( $the_query->have_posts() ): ?> <?php while ( $the_query->have_posts() : $the_query->the_post(); ?> <table> <tbody> <tr> <th>【<?php the_field('number'); ?>】<?php the_title(); ?></th> </tr> <tr> <td> <?php the_post_thumbnail( array(100,100) ); ?> </td> </tr> <tr> <td> <a href="<?php the_permalink() ?>" class="btn-open1">詳細表示</a><br> <a href="<?php echo esc_url(home_url('/')); ?>form/?post_id=<?php echo $post->ID; ?>" class="btn-open2">見積り・問い合わせ</a> </td> </tr> </tbody> </table> <?php endwhile; ?> <?php wp_reset_postdata(); ?> <?php else: ?> <h2>記事なし</h2> <?php endif; ?> 恐れ入りますが、ご教示いただけますでしょうか?
CHERRY

2019/04/11 01:54

Webサーバのログを確認して、どのようなエラーが出ているかわかりますか?
CHERRY

2019/04/11 01:55 編集

とりあえず、 > <?php while ( $the_query->have_posts() : $the_query->the_post(); ?> の while で、` ) ` がひとつ足らないのは見つけましたが... 正しくは、 ``` <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> ``` だと思います。
pastoral

2019/04/11 02:06

ご回答有り難うございます。 以下のようなエラーログが出ています。 [Thu Apr 11 11:04:06 2019] [error] [client xxx.xxx.xxx.xx] PHP Parse error: syntax error, unexpected ':' in /usr/home/sanflower/html/wp/wp-content/themes/pastoral/content-archive.php on line 27, referer: http://sample.com/
CHERRY

2019/04/11 02:15 編集

content-archive.php の 27行目で、` : ` のあたりに文法エラーがあると言っています。 27行目が、 while の行であれば、 上記の ` ) ` が足らないのが原因ですね。
pastoral

2019/04/11 02:17

ご回答有り難うございます。 初歩的な間違いでした… 「)」を追加したら無事、soldputを除いた記事20件表示されました!
guest

0

自己解決

<?php $args = array( 'meta_key' => 'up_icon', 'meta_value' => 'soldout', 'meta_compare' => '!=' ); $the_query = new WP_Query( $args ); ?> <?php if ( $the_query->have_posts() ): ?> <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <table> <tbody> <tr> <th>【<?php the_field('number'); ?>】<?php the_title(); ?></th> </tr> <tr> <td> <?php the_post_thumbnail( array(100,100) ); ?> </td> </tr> <tr> <td> <a href="<?php the_permalink() ?>" class="btn-open1">詳細表示</a><br> <a href="<?php echo esc_url(home_url('/')); ?>form/?post_id=<?php echo $post->ID; ?>" class="btn-open2">見積り・問い合わせ</a> </td> </tr> </tbody> </table> <?php endwhile; ?> <?php wp_reset_postdata(); ?> <?php else: ?> <h2>記事なし</h2> <?php endif; ?>

投稿2019/04/11 06:00

pastoral

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問