• 解決済 nyan-nyan

    (@nyan-nyan)


    カスタム投稿タイプを作成しカスタムフィールドを軸にソートしたいと思い、
    下記コードを使用しました。

    $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);

    ご教授いただければ幸いです。
    よろしくおねがいします。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • 試してみたところ、投稿タイプsample_typeと標準のカスタムフィールドでratings_scoreというフィールドを作って数値を入れた場合は表示されますけどね。
    WP-PostRatingsはよくわかりませんが…。

    • WordPress 3.8.1
    • Custom Post Type UI 0.8.2
    • twentyfourteenテーマ

    でindex.phpを編集して試しました。

    トピック投稿者 nyan-nyan

    (@nyan-nyan)

    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');
    }
    トピック投稿者 nyan-nyan

    (@nyan-nyan)

    Tsuyoshi.様
    早急なレスありがとうございます。

    ご教授いただいたコードでテストを行った結果、
    まさに理想的な動作になりました。

    プラグインの関数まで調査してご対応いただき
    本当にありがとうございます。

    一時はカスタム投稿を中止して
    サイトの再設計まで考えていました。
    おかげさまで前進できそうです。

    また、Tsuyoshi.様の問題点の解析・問題点に対する対応の早さに脱帽しました。

    機会があれば再度ご教授いただければ幸いです。
    本当にありがとうございました!

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「カスタム投稿のmeta_keyでソート」には新たに返信することはできません。