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

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

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

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

PHP

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

Q&A

解決済

1回答

4840閲覧

Wordpress 複数キーでのソート

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/01/27 12:18

前提・実現したいこと

Wordpressにて複数のカスタムフィールドの値をキーにしてソートしたいです。
score1の値が同じ場合、score2の値を参考に記事を並べたいです。
score1、score2共に0〜5までの数字(小数点第二位まで)が入ります。

ソースコード

PHP

1$args = array( 2 'orderby' => array( 3 'score1' => 'DESC',//meta_valueの値で並べる 4 'score2' => 'DESC',//meta_valueの値で並べる 5 ), 6 'meta_query' => array( 7 'relation' => 'AND', 8 'score1' => array( 9 'key' => 'score1', 10 'type' => 'numeric', 11 ), 12 'score2' => array( 13 'key' => 'score2', 14 'type' => 'numeric', 15 ), 16 //'meta_key' => 'ol',//並べ替えたいカスタムフィールドキー 17 ), 18); 19 20 21$the_query = new WP_Query( $args ); 22

現状

1.score1の順で並ぶが、score1の値が同じ場合、score2の値が無視され適当に並ぶ。
2.アクセスする度に、score1の値が同じ記事の並び順が変わる。

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

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

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

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

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

guest

回答1

0

ベストアンサー

提示されている部分だけをみる限りでは、問題なさそうに感じます。

どうしてもうまくいかないということであれば、Query Monitor プラグインをインストールして、実行された SQL 文を確認してみてください。


見落とししていないか気になったので、実際に試してみました。

テンプレート home.php を下記の内容で作成。

PHP

1<?php get_header(); ?> 2 3<div class="wrap"> 4 <div id="primary" class="content-area"> 5 <main id="main" class="site-main" role="main"> 6<?php 7$args = array( 8 'orderby' => array( 9 'score1' => 'DESC', 10 'score2' => 'DESC', 11 ), 12 'meta_query' => array( 13 'relation' => 'AND', 14 'score1' => array( 15 'key' => 'score1', 16 'type' => 'numeric', 17 ), 18 'score2' => array( 19 'key' => 'score2', 20 'type' => 'numeric', 21 ), 22 ), 23); 24$the_query = new WP_Query( $args ); 25while ( $the_query->have_posts() ) : $the_query->the_post(); 26 echo "<div>"; 27 echo $post->ID ."<br>"; 28 the_title('<p>', '</p>'); 29 echo "<p>". get_field('score1') ." - ". get_field('score2') ."</p>"; 30 echo "</div>"; 31endwhile; 32?> 33 </main><!-- #main --> 34 </div><!-- #primary --> 35</div><!-- .wrap --> 36 37<?php get_footer(); ?>

を作成して ACF で、score1, score2 のカスタムフィールドを作成して、0 - 100 で、適当な値を入れて実行してみました。

表示された結果は、score1 の降順, score2 の降順に並んでいました。

また、Query Monitor プラグインで、実行された SQLクエリをみてみると

SQL

1SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 2FROM wp_posts 3INNER JOIN wp_postmeta 4 ON ( wp_posts.ID = wp_postmeta.post_id ) 5INNER JOIN wp_postmeta AS mt1 6 ON ( wp_posts.ID = mt1.post_id ) 7WHERE 1=1 8AND ( wp_postmeta.meta_key = 'score1' 9 AND mt1.meta_key = 'score2' ) 10AND wp_posts.post_type = 'post' 11AND (wp_posts.post_status = 'publish' 12 OR wp_posts.post_status = 'acf-disabled' 13 OR wp_posts.post_status = 'private') 14GROUP BY wp_posts.ID 15ORDER BY CAST(wp_postmeta.meta_value AS SIGNED) DESC, CAST(mt1.meta_value AS SIGNED) DESC 16LIMIT 0, 20

となっていて、SQLクエリからも問題なさそうです。

もし、$args に他のパラメータが入っているのであれば、一度 質問に記載された内容だけにして試してみたらどうでしょうか?

投稿2019/01/30 03:22

編集2019/01/30 03:49
CHERRY

総合スコア25171

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問