Pesan posting (di seluruh situs) berdasarkan tanggal metadata

8

Halaman 'Home' khusus saya diatur untuk mengurutkan posting kustom saya melalui bidang tanggal kustom dengan kode ini (diperbarui menjadi nama kustom) di 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;
    }
}



}

Yang keren dan sederhana. Sekarang. Saya ingin ini berfungsi di seluruh situs. Saya ingin posting pada halaman arsip, kategori dll untuk disortir terlebih dahulu oleh bidang tanggal kustom.

Ada ide?

Saya telah mencoba mengubah ' if' ke is_archive()tetapi itu tidak berpengaruh. Saya mencoba <! is_single()>juga.

Saya yakin itu harus sesuatu yang sederhana. Tapi saya baru mengenal php dan karenanya tidak mengerti.

Inilah situsnya , tempat Anda dapat melihat beranda yang disortir dengan baik, tetapi jika Anda mengklik 'puisi' (satu-satunya dengan beberapa posting), pengurutan tidak berfungsi.

Setiap saran akan disambut dengan banyak sukacita.

Terima Kasih.

wah
sumber
Anda harus mengawali semua fungsi Anda dengan misalnya. josh_untuk menghindari penamaan tabrakan.
kaiser
Apakah maksud Anda sebagai praktik yang baik atau untuk menyelesaikan ini? Saya mencoba menyalin kode lagi untuk 'is_archive' dan itu membiarkan saya memanggil fungsi lagi, tetapi penyortiran tidak berfungsi ...
josh
1
Ya itu latihan yang bagus. Plus: Anda tidak harus membungkus fungsi dalam fungsi.
kaiser
keren, keren (saya baru menyalin kode dari situs web, tbh. Saya baru mengenal php & wordpress). Adakah kemajuan tentang cara membuatnya berfungsi di seluruh situs? Saya memilikinya bekerja dengan lebih banyak halaman khusus dan fungsi yang sama diatur ke (is_page ()) tapi tetap saja ini tidak melakukan apa-apa untuk halaman arsip saya. Saya tidak tahu bagaimana cara memperbaikinya ...
josh
1
Alih-alih menempatkan fungsi dalam fungsi, coba gunakan kelas sebagai gantinya.
Manny Fleurmond

Jawaban:

2

Gunakan query_varsatau permintaan filter untuk menambahkan orderbyjika orderbytidak disajikan dalam string kueri

Maxim Krizhanovsky
sumber
+1 untuk requestsaran filter
Michal Mau
@ josh juga memeriksa jawaban ini wordpress.stackexchange.com/a/21378/2110 untuk melihat bagaimana menguji is_archive()dan serupa di awal proses.
Michal Mau
filter permintaan memang, teriakan yang bagus.
Astaga
0

Mengapa Anda tidak menggunakan 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();

Anda juga dapat mengubah kueri menggunakan kait pre_get_posts dan melakukan pengurutan kondisional Anda di sana dengan is_archive (), is_page () dll ...

Brian Fegter
sumber
0

Saya melihat pertanyaan Anda yang lain juga.

Jika Anda ingin mengurutkan berdasarkan nilai meta tanggal, mereka harus secara alami berada dalam format yang sama - Saya rasa ini format tanggal PHP ('m-y') seperti yang Anda tentukan dalam kode di sana?

Jika itu masalahnya, Anda mungkin menemukan bahwa jika Anda mengubah meta_valuekode itu untuk meta_value_nummendapatkan hasil yang lebih baik?

Tidak yakin ini akan berhasil, tetapi mungkin patut dicoba.

djb
sumber