質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

WordPress

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

PHP

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

Q&A

解決済

2回答

627閲覧

wordpressのカスタムフィールドを使った条件分岐で飛び先を変えたい

musashidayo

総合スコア54

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

WordPress

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

PHP

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

0グッド

0クリップ

投稿2018/01/29 07:52

編集2018/01/29 10:37

wordpressのリンクをクリックした際の遷移先を分岐させたい。
具体的に言うと、人物が作った⇒モノという関係があり、人物一覧ページを作っていて、それは固定ページで作っています。人物が複数のモノを作っていると、人物名の一覧固定ページに同じ名前が並びます。
それを避けるために、その人物が複数のモノを作っていたら人物名をクリックするとその人物が作ったモノのアーカイブページに遷移させたいのですが、条件分岐のいい方法が思い浮かびません。

もっと簡潔に説明すると、カスタムフィールドで作った「人物」の項目が同じpostがあった時にリンクの飛び先をpostのアーカイブページにしたいのと、人物名一覧の固定ページで、「人物」が複数表示されないようにしたいということです。

<?php <!--postの人物名を取得してループ処理で出力--> ?> <?php if('人物名が同じpostが複数になったら'){ ?> <a href="<?php the_permalink('人物名が同じpostのアーカイブ'); ?>"><?php the_field('人物名'); ?></a> <?php }else{ ?> <a href="<?php the_permalink('postページ'); ?>"><?php the_field('人物名'); ?></a> <?php } ?>

こんな感じで考えているのですが、もっといい方法があるかwordpressに詳しい方アドバイスをお願いします。
また、

<?php if('人物名が同じpostが複数になったら'){ ?>

この部分の良い書き方で特に悩んでいます。
よろしくお願いします。

追記

<?php $wp_query = new WP_Query(); $my_posts = array( 'post_type' => 'post', 'category_name' => '50音順の◯行のスラッグ', ); $wp_query->query( $my_posts ); if( $wp_query->have_posts() ): while( $wp_query->have_posts() ) : $wp_query->the_post(); ?> <!--ここにループする内容--> <li><a href="<?php the_permalink(); ?>"><?php the_field('人物名'); ?></a></li> <?php endwhile; endif; wp_reset_postdata(); ?>

現在はこのような方法であ〜わ行まで分けて出力しています。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/01/29 08:09 編集

カスタムフィールドがどのような形で投稿に紐付いているのかもう少し詳しく書いていただけますか?投稿に「人物」というカスタムフィールドがあり、そこに作者名が入ってる。それだけでしょうか?
musashidayo

2018/01/29 08:13

1つ1つのpostに直接「フィールドラベル'人物'」、「フィールド名'post_author'」「フィールドタイプ'テキスト'」というカスタムフィールドが紐付いています。ここに人物名を入れるとアーカイブページに表示されるという風に現在は使っています。
guest

回答2

0

ベストアンサー

確かにちょっと難しいですね。
array_count_values()で出現数をカウントするのが王道だとは思いますが、これはオブジェクトには使えないので一度配列に入れる必要があります。

  1. get_posts()等で投稿を取得する
  2. 取得した投稿のカスタムフィールド値を全て取得し配列に入れる
  3. array_count_values()で作者名の出現数をカウントする
  4. 投稿をforeachしてカウントが2以上のものは別アーカイブページのリンクを出力 ←ここが<?php if('人物名が同じpostが複数になったら'){ ?>の部分
  5. 出力したら2回目以降に出現する同作者の投稿は要らないので重複削除してしまう

こんな感じでしょうか?
SQL文を駆使して、投稿を取得してくる時点で重複を抽出すればもっと簡単だとは思うのですがSQLには詳しくないので…。

もっと良い案が他の回答者さんから出るかもしれないので参考程度にしてください。

投稿2018/01/29 08:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

回答とこちら( https://ja.wordpress.org/support/topic/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E3%82%BF%E3%82%B0%E3%81%A8%E5%90%8C%E3%81%98%E3%82%88%E3%81%86%E3%81%AB%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%95/ )を参考にして、

<p>◯行</p> <ul> <?php $wp_query = new WP_Query(); $my_posts = array( 'post_type' => 'post', 'category_name' => '50音順の◯行のスラッグ', ); $h = []; $wp_query->query( $my_posts ); if( $wp_query->have_posts() ): while( $wp_query->have_posts() ) : $wp_query->the_post(); $h[] = get_field('人物名のスラッグ'); ?> <?php endwhile; endif; wp_reset_postdata(); ?> <?php $hito = array_count_values($h); $wp_query = new WP_Query(); $my_posts = array( 'post_type' => 'post', 'category_name' => '50音順の◯行のスラッグ', ); $numbercheck = $wp_query->query( $my_posts ); if( $wp_query->have_posts() ): while( $wp_query->have_posts() ) : $wp_query->the_post(); $a = get_field('人物名のスラッグ'); if($hito["$a"]>=2){ }else{ ?> <li><a href="<?php the_permalink(); ?>"><?php the_field('人物名のスラッグ'); ?></a></li> <?php } ?> <?php endwhile; endif; wp_reset_postdata(); ?> <?php foreach($hito as $key => $value){ if($value>=2){ ?> <li><a href="/post-unei?key=post-unei&value=<?php echo $key; ?>"><?php echo $key; ?></a></li> <?php }} ?> </ul>

で渡して、飛び先のアーカイブページでは、

<?php $args = array( 'posts_per_page' => 10, 'category_name' => '', 'orderby' => 'date', 'order' => 'DESC', 'meta_key' => '人物名のスラッグ', //カスタムフィールドのキー 'meta_value' => $_GET['value'], //カスタムフィールドの値 ); $my_query = new WP_Query($args); if ($my_query->have_posts()) : while ($my_query->have_posts()) : $my_query->the_post(); ?> <?php get_template_part( '表示させたい項目のテンプレ.php', get_post_format() ); ?> <?php endwhile; endif; wp_reset_postdata(); ?>

で上手く表示出来ました!
一回配列$hに全ての人物名を入れてからもう一回whileでループを回さなければいけないので書き方が煩雑なので、もう少し簡潔に表示出来る方法があれば教えて頂けると幸いです。

投稿2018/01/31 08:39

musashidayo

総合スコア54

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問