メタデータの日付で(サイト全体の)投稿を注文する


8

私のカスタム「ホーム」ページは、functions.phpの次の(カスタム名に更新された)コードを使用して、カスタム日付フィールドを介してカスタム投稿をソートするように設定されています。

// sort order for home page
add_action('wp', 'wwgo_check_page');
function wwgo_check_page () {
if (is_page()) {
    add_filter('get_previous_post_sort', 'sort_it');
    add_filter('get_next_post_sort', 'sort_it');
    add_filter('posts_orderby', 'sort_it' );
    add_filter('posts_join', 'join_it' );
    add_filter('posts_where', 'where_it' );

    function sort_it () {
        global $wpdb;

        return " $wpdb->postmeta.meta_value ASC ";
    }

    function join_it( $join ) {
        global $wpdb;

        $join .= " LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id) ";

      return $join;
    }

    function where_it( $where ) {
        global $wpdb;
        $where .= "AND $wpdb->postmeta.meta_key = 'deadline' ";

      return $where;
    }
}



}

ダンディでシンプルです。今。これをサイト全体で機能させたい。アーカイブページ、カテゴリなどへの投稿を、最初にカスタム日付フィールドで並べ替えたい。

何か案は?

if」をに変更しようとしましたis_archive()が、効果がありませんでした。私<! is_single()>もやってみました。

きっとシンプルなはずです。しかし、私はphpに慣れていないため、無知です。

こちらがサイトです。ホームページがうまくソートされているのがわかりますが、「詩」(投稿がいくつかあるだけ)をクリックしてもソートは機能しません。

どんな提案も大喜びで満たされます。

誠にありがとうございます。


たとえば、すべての関数の前にforを付ける必要があります。josh_衝突の命名を避けるため。
カイザー、2011年

それは良い習慣として、またはこれを解決するためですか?「is_archive」のコードを再度コピーしてみましたが、関数を再度呼び出すことはできましたが、並べ替えが機能しませんでした...
josh

1
はい、それは良い習慣です。さらに、関数を関数にラップしないでください。
カイザー、2011年

クール、クール(私はちょうどウェブサイトからコードをコピーしました、tbh。私はphp&wordpressが初めてです)。これをサイト全体で機能させる方法について何か進歩はありますか?私はそれがより多くのカスタムページで動作していて、同じ関数が(is_page())に設定されていますが、それでも私のアーカイブページには何もしません。私はそれらを修正する方法の手がかりがありません...
ジョシュ

1
関数に関数を配置する代わりに、代わりにクラスを使用してみてください。
Manny Fleurmond、2011年

回答:


2

query_varsまたはリクエストフィルタを使用して、クエリ文字列にないorderby場合に追加orderbyします


requestフィルター候補の+1
Michal Mau

@joshもこの回答wordpress.stackexchange.com/a/21378/2110をチェックしis_archive()て、プロセスの早い段階でテストする方法などを確認します。
Michal Mau

リクエストフィルターは確かに、良い叫びでした。
josh

0

query_posts()を使用しないのはなぜですか?

<?php
query_posts('meta_key=key_name&orderby=key_name&sort=ASC');
if ( have_posts() ) : while ( have_posts() ) : the_post();

endwhile; else:

endif;

wp_reset_query();

pre_get_postsフックを使用してクエリを変更し、is_archive()、is_page()などで条件付きソートを行うこともできます...


0

私もあなたの他の質問を見ています。

日付のメタ値で並べ替える場合、それらは当然同じ形式でなければなりません-コードで指定したPHPの日付( 'm-y')形式だと思いますか?

その場合、meta_valueそのコードを変更するとmeta_value_num、より良い結果が得られますか?

これが機能するかどうかはわかりませんが、試してみる価値があるかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.