カスタム投稿のmeta_keyでソート
-
カスタム投稿タイプを作成しカスタムフィールドを軸にソートしたいと思い、
下記コードを使用しました。$args = array( 'post_type' => 'sample_type', 'posts_per_page' =>3, 'orderby' => 'meta_value_num', 'meta_key' => 'ratings_score', 'order' => 'DESC' ); query_posts($args);
ですが、何も表示されません。
ちなみに’meta_key’ => ‘ratings_score’を削除すると一応表示はされます。
何が原因で正しく表示されないのでしょうか?
カスタム投稿タイプは[Custom Post Type UI]で作成。
カスタム投稿タイプの作成・設定が方法が違うのか??‘meta_key’ => ‘ratings_score’は[WP-PostRatings]のキーになります。
通常の投稿とカテゴリーを使用した場合は
思い通りに実行されているので’meta_key’は生きていると思います。$args = array( 'post_type' => 'post', 'cat' => 1, 'posts_per_page' =>3, 'orderby' => 'meta_value_num', 'meta_key' => 'ratings_score', 'order' => 'DESC' ); query_posts($args);
ご教授いただければ幸いです。
よろしくおねがいします。
-
試してみたところ、投稿タイプsample_typeと標準のカスタムフィールドでratings_scoreというフィールドを作って数値を入れた場合は表示されますけどね。
WP-PostRatingsはよくわかりませんが…。- WordPress 3.8.1
- Custom Post Type UI 0.8.2
- twentyfourteenテーマ
でindex.phpを編集して試しました。
Tsuyoshi.様
返信ありがとうございます。
また環境を整えてテストしてくださり、感激です。>>フィールドを作って数値を入れた場合は表示されますけどね。
こちらがヒントになり数値を入れたら表示されました。*WP-PostRatingsは投稿記事に対してメンバーが評価するプラグインです。
ですから投稿時は値が0になります。テーブルpostmetaのmeta_key参照すると、
カスタム投稿時にratings_scoreが挿入されていませんでした。
それどころかWP-PostRatings全部のカスタムフィールドが挿入されていません。
投稿後、評価されると同時に初めて記事に対してratings_scoreが挿入されています。通常投稿時は投稿と同時に
meta_keyにratings_score
meta_valueに0
が挿入されていました。この違いからカスタム投稿は失敗し、通常投稿は成功するようです。
通常投稿画面のカスタムフィールドドロップダウンの内容と
カスタム投稿画面のカスタムフィールドドロップダウンの内容は一致しています。プラグインの相性問題なのでしょうか?
add_action('publish_post', 'add_ratings_fields'); add_action('publish_page', 'add_ratings_fields');
というフックをプラグイン側では使用してカスタムフィールドを更新していて、カスタム投稿の更新時にはこのフックを通らないようなので、そのような現象になっているみたいです。
あんまりよろしくないかもしれませんが例えばfunctions.phpに以下のコードを記述すると投稿時カスタムフィールドがない時に値に0を入れた状態でカスタムフィールドを作ってくれます。
ratings_score以外も処理を追加すればカスタム投稿でも初期値0で投稿できるでしょう。
暫定処置みたいな感じですが…。<?php // add_action( フックするアクション名, コールバック, 実行優先順位, 引数の数 ) add_action( 'save_post' , 'action_save_post', 99, 2 ); function action_save_post( $post_id, $post ) { if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) { /** 自動保存時は何もしない */ return $post_id; } elseif ( !empty( $_POST ) ) { /** 投稿更新時 */ // カスタムフィールドを取得する $ratings_score = get_post_meta( $post_id, 'ratings_score', true ); if( !is_numeric( $ratings_score ) ) { // カスタムフィールドを更新する update_post_meta( $post_id, 'ratings_score', 0 ); } } }
一番手っ取り早いコードはこれかもしれません。
functions.php
<?php // 投稿タイプsample_typeでもカスタムフィールドを更新 ( ※add_ratings_fieldsはプラグインの関数 ) if( function_exists( 'add_ratings_fields' ) ) { add_action('publish_sample_type', 'add_ratings_fields'); }
- トピック「カスタム投稿のmeta_keyでソート」には新たに返信することはできません。