メタ値で並べ替え、最初にプロ、次に無料
-
-
WPSEへようこそ.まずは、[ツアー]ページにアクセスして、サイトの運営方法をご確認ください.また、サイト関連の質問については、[ヘルプ]にアクセスしてください.あなたの質問に戻るために、私はいくつかの問題をクリアする必要があります、あなたはメタ値としてfreeとproを使ってメタキーからランダムに投稿をフェッチしたいと思います.10件の投稿(4件のプロと6件の無料)を取得したとします.最初に4件のプロの投稿を表示し、次に他の6件を無料で表示する必要があります.ヒントです.`query_posts`を使用せず、 `WP_Query`を使用してくださいWelcome to WPSE. To start you off, please feel free to visit our [tour] page to get a feel on how the site operate. Also visit [help] for any site related questions. To come back to your question, I just need to clear some issues, you want to randomly fetch posts from a meta key with free and pro as meta values. Say you get 10 posts, 4 pro and 6 free, the 4 pro posts must be shown first, then the other 6 free. Just a tip, do not use `query_posts`, rather use `WP_Query`
- 0
- 2014-10-13
- Pieter Goosen
-
k感謝は私がquery_postsを使用したことを意味します-の組み込み関数.tax-list.phpなので、新しいcat.phpファイルを作成する必要がありますか?新しいループの場合?または同じファイルでwpを使用しましたか?k thanks means i used query_post in - inbuild function of theme. tax-list.php so i need to create new cat.php file ? for new loop ? or used wp in same file ?
- 0
- 2014-10-13
- itcgpit mark
-
同じファイルを使用し、 `query_posts`を` WP_Query`に変更するだけです.また、これがあなたがやろうとしていることであるかどうか、私の最後のコメントについてアドバイスしてくださいUse the same file, just change `query_posts` to `WP_Query`. Also, please advice on my last comment whether this is what you are trying to do
- 0
- 2014-10-13
- Pieter Goosen
-
ya私はのようにしようとしています. カテゴリリストのページ 投稿タイプ=リスト メタ値=proおよびfreeですが、最初にproを表示し、次にfree.soを表示します. WP_Query($ query_string. '&orderby=meta_value_num'); 未定義の関数WP_Query()の呼び出し エラーya i am trying like. in page of category listing post type = listing meta value = pro and free but first display pro then free .so order by meta value order DESC WP_Query($query_string . '&orderby=meta_value_num'); Call to undefined function WP_Query() error
- 0
- 2014-10-13
- itcgpit mark
-
たとえば、私のカテゴリページに10件の投稿がある場合、ランダムで10個が必要ですが、最初にメタ値=プロ、次にメタ値=無料です.OK . 現在、ランダムに動作しています.すべてまたはすべての投稿のみ、または無料のみです.しかし、私はこの問題を解決するのがとても簡単なメタ値による順序が欲しいですfor ex in my category page if there 10 post then i want 10 with random but meta value = pro first then meta_value = free then. ok . right now random working .with all or only post or only free. but i want order by meta value so easy for me to solve this issues
- 0
- 2014-10-13
- itcgpit mark
-
[`WP_Query`](http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters)にアクセスして、メタクエリパラメータがどのように機能し、どのように構築する必要があるかを理解してください.また、orderbyパラメータを確認してくださいPlease visit [`WP_Query`](http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters) to understand how the meta query parameters work and how it should be constructed. Also, check the orderby parameters
- 0
- 2014-10-13
- Pieter Goosen
-
2 回答
- 投票
-
- 2014-10-13
解雇する前に、絶対に(私の強調)
query_posts
でカスタムクエリを作成注:この関数は、プラグインやテーマで使用するためのものではありません.後で説明するように、メインクエリを変更するためのより優れたパフォーマンスの高いオプションがあります. query_posts()は、ページのメインクエリをクエリの新しいインスタンスに置き換えることで、ページのメインクエリを変更するための非常に単純で問題のある方法です.これは非効率的であり(SQLクエリを再実行します)、状況によっては完全に失敗します(特に、投稿のページネーションを処理する場合).
むしろ、
をご覧ください.WP_Query
またはget_posts
を使用してカスタムクエリを作成しますが、のみpre_get_posts
でメインクエリを変更することはできません.詳細については、この投稿 meta_key
の値が2つしかない場合(注意:テストの目的で、私は独自のメタキーを使用しました.これを独自のメタキーに置き換える必要があります )、つまりpro
とfree
の場合、この特定のmeta_key
を持つ投稿を取得できます.クエリは次のようになります:$args = [ 'meta_key' => 'packages', 'orderby' => 'rand', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args );
ただし、これら2つよりも多くの値がある場合は、クエリを調整して
meta_value
を含めてから、meta_compare
パラメータを使用する必要があります.調整されたクエリは次のようになります.$args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ];
( PS!先に進む前に、バージョン4.0で
>orderby
パラメータが変更されていることに注意してください.ただし、この場合は機能しません.これで、ランダムに取得された5つの投稿があり、
のいずれかがあります.pro
のmeta_value
またはfree
次に、それらを並べ替える必要があります.最善の解決策は、
usort
投稿のmeta_value
の値に従って、meta_value
で返された投稿の配列を並べ替えます.次に、meta_value
の設定を解除してから、並べ替えられたpost配列でリセットする必要があります.完全なコードは次のとおりです:
<?php $args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args ); $post_metas = $the_query->posts; usort( $post_metas, function( $a, $b ){ $a = get_post_meta( $a->ID , 'packages', true ) ; $b = get_post_meta( $b->ID, 'packages', true ) ; if ( $a == $b ) { return 0; } return ( $a > $b ) ? -1 : 1; } ); unset($the_query->posts); $the_query->posts = $post_metas; if ( $the_query->have_posts() ) { echo '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '<li>' . get_post_meta( get_the_ID(), 'packages', true ). '</br>' . get_the_title() . '</li>'; } echo '</ul>'; } wp_reset_postdata(); ?>
必要に応じてクエリ変数を調整し、必要なものを表示するようにループを調整する必要があります
これを実現する唯一の方法ではありませんが、並べ替え関数をfunctions.phpに移動して、このカスタムクエリを具体的にターゲットにすることもできます
Before I fire away, just one note, NEVER (my emphasis) make use of
query_posts
to create custom queriesNote: This function isn't meant to be used by plugins or themes. As explained later, there are better, more performant options to alter the main query. query_posts() is overly simplistic and problematic way to modify main query of a page by replacing it with new instance of the query. It is inefficient (re-runs SQL queries) and will outright fail in some circumstances (especially often when dealing with posts pagination).
Rather make use of
WP_Query
orget_posts
to create custom queries, but ONLY if you can't modify the main query withpre_get_posts
. For more info, check out this postAssuming that there are only two values for your
meta_key
(PLEASE NOTE: For testing purposes, I have used my own meta key, you should replace this with your own), namelypro
andfree
, you can just retrieve posts that has this specificmeta_key
. Your query will then look something like this:$args = [ 'meta_key' => 'packages', 'orderby' => 'rand', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args );
If you however have more values than just these two, then you will need to adjust your query to include the
meta_value
and then make use of themeta_compare
parameter. Your adjusted query will then become:$args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ];
(PS! Before I go on, you should note that the
orderby
parameter has changed in version 4.0, but this will not work in this instance.Great, you will now have 5 posts that was retrieved randomly which has either a
meta_value
ofpro
orfree
Now we need to sort them. The best possible solution is to make use of
usort
to sort the returned array of posts in$the_query->posts
according to the value of the postsmeta_value
. You will then need to unset$the_query->posts
and then reset it with the reordered post array.Here is the complete code:
<?php $args = [ 'meta_key' => 'packages', 'meta_value' => 'free, pro', 'orderby' => 'rand', 'meta_compare' => 'IN', 'posts_per_page' => 5, ]; $the_query = new WP_Query( $args ); $post_metas = $the_query->posts; usort( $post_metas, function( $a, $b ){ $a = get_post_meta( $a->ID , 'packages', true ) ; $b = get_post_meta( $b->ID, 'packages', true ) ; if ( $a == $b ) { return 0; } return ( $a > $b ) ? -1 : 1; } ); unset($the_query->posts); $the_query->posts = $post_metas; if ( $the_query->have_posts() ) { echo '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '<li>' . get_post_meta( get_the_ID(), 'packages', true ). '</br>' . get_the_title() . '</li>'; } echo '</ul>'; } wp_reset_postdata(); ?>
You will just need to adjust the query variables to suit your needs and also adjust the loop to display what is needed
This is not the only way to achieve it though, you can also move your sorting function to your functions.php and specifically target this custom query
-
あなたがたは私が最初にプロとランダムな感謝を得ました.しかし、今ではすべての投稿として表示結果が表示されます.しかし、私はperticulerカテゴリのみが必要です.カテゴリをクリックして、そのカテゴリだけを投稿したいのですが、 また、私の投稿タイプ=リストye i got pro first as well as random thanks . but now its display result as all post.. but i want only for perticuler category. like i click on categoryand i want post of only that category thanks also my post type = listing
- 0
- 2014-10-15
- itcgpit mark
-
引数に `'cat'=>get_queried_object( 'cat')-> cat_ID、`を追加するだけですJust add `'cat' => get_queried_object('cat')->cat_ID,` to your arguments
- 0
- 2014-10-15
- Pieter Goosen
-
おかげで私はデータベースで完璧な出力を得ました.出力SQLを渡すとき.今私はhtmlを変更する必要があるだけでエコー部分を意味します.aslですが、今は無料でプロですが、その値をランダムにしたいです.ありがとうございます また、htmlまたはページに表示したいものを変更する必要がありますありがとうthanks i got perfect output in database. when i pass output sql. now i just need to change in html means echo part. asl but right now its pro after free but i want that value as random .?.thanks i also need to changes in html or what i want to display in page thanks
- 0
- 2014-10-15
- itcgpit mark
-
解決してよかったです.HTMLセクションに関しては、それはこの質問の範囲外です.HTML関連のものもこのサイトでは話題から外れています.ページのhtml構造についてサポートが必要な場合は、stackoverflow.comで新しい質問をする必要があります.これは、これらのタイプの質問により適しています.ありがとうございましたGlad that is solved. As for the HTML section, that is out of scope of this question. HTML related stuff is also off topic on this site. If you need help with the html structure of your page, you should ask a new question over at stackoverflow.com which is better suited for these type of questions. Thank you
- 0
- 2014-10-15
- Pieter Goosen
-
どうもありがとうございました.私は今、エコーで必要な正しいデータを取得しました.画像のタイトルとdes.テーマ形式に従って.わかりましたありがとうございます:)thanks a lot u saved my day. i got right data now just need in echo. an image title and des. with as per theme formate. ok thanks sir :)
- 0
- 2014-10-15
- itcgpit mark
-
ページごとに投稿することはありません..これはページネーションを壊します... !!it will not take post per page.. this will break pagination in ...!!
- 0
- 2014-10-15
- itcgpit mark
-
- 2014-10-13
meta_key
ではなくmeta_value
でクエリを実行する必要があります:$query_string . '&meta_key=name_of_key_that_stores_free_or_pro&orderby=meta_value_num'
You need to query by the
meta_key
instead ofmeta_value
:$query_string . '&meta_key=name_of_key_that_stores_free_or_pro&orderby=meta_value_num'
-
返信ありがとうございますが、動作しませんでした query_posts($ query_string. '&meta_key=J_listing_type&orderby=meta_value_num'); 動作しないthanks for reply but its not working i used query_posts($query_string . '&meta_key=J_listing_type&orderby=meta_value_num'); but not working
- 0
- 2014-10-13
- itcgpit mark
-
`orderby=meta_value`だけを試してくださいTry just `orderby=meta_value`
- 0
- 2014-10-13
- TheDeadMedic
-
私もこれを試しますが、機能しません:(i try this also but not working :(
- 0
- 2014-10-13
- itcgpit mark
プロリストをランダムに取得しますが、
pro
と無料が必要ですが、最初にpro
リストを使用し、次にmeta_value
free
リスト.orderby
meta_value
これは機能せず、クエリ文字列ではデフォルトで
cat
になります.orderby
とdate
の両方でorderby
free
が必要です.何か提案はありますか?