Saya memiliki 3 kategori dengan masing-masing 15 posting, saya ingin melakukan SATU permintaan ke db hanya membawa 5 posting pertama untuk setiap kategori, bagaimana saya bisa melakukannya?
$q = new WP_Query(array( 'post__in' => array(2,4,8), 'posts_per_page' => **FIRST_5_OF_EACH_CAT** ));
Jika tidak memungkinkan, apa yang lebih efisien, mendapatkan semua posting untuk kategori induk dan mengulanginya atau membuat 3 pertanyaan berbeda?
query-posts
Amit
sumber
sumber
Jawaban:
Apa yang Anda inginkan adalah mungkin tetapi akan meminta Anda mempelajari SQL yang ingin saya hindari kapan pun memungkinkan (bukan karena saya tidak mengetahuinya, saya adalah pengembang SQL tingkat lanjut, tetapi karena di WordPress Anda ingin menggunakan API bila memungkinkan untuk meminimalkan masalah kompatibilitas di masa depan terkait dengan perubahan struktur basis data potensial di masa depan.)
SQL dengan
UNION
Operator adalah KemungkinanUntuk menggunakan SQL yang Anda butuhkan adalah
UNION
operator dalam kueri Anda, sesuatu seperti ini dengan asumsi siput kategori Anda"category-1"
,"category-1"
dan"category-3"
:Anda dapat menggunakan SQL UNION dengan
posts_join
FilterDengan menggunakan di atas Anda bisa langsung melakukan panggilan atau Anda dapat menggunakan
posts_join
hook filter seperti berikut; perhatikan saya menggunakan PHP heredoc jadi pastikanSQL;
flush kiri. Juga perhatikan saya menggunakan var global untuk memungkinkan Anda mendefinisikan kategori di luar hook dengan mendaftar siput kategori dalam array. Anda dapat meletakkan kode ini di plugin atau difunctions.php
file tema Anda :Tapi Bisa Ada Efek Samping
Tentu saja menggunakan kait modifikasi permintaan seperti
posts_join
selalu mengundang efek samping karena mereka bertindak secara global pada permintaan dan dengan demikian Anda biasanya perlu membungkus modifikasi Anda dalamif
yang hanya menggunakannya ketika diperlukan dan kriteria apa untuk menguji bisa rumit.Berfokuslah pada Optimasi?
Namun, saya berasumsi bahwa pertanyaan Anda lebih menyangkut optimasi daripada tentang kemampuan melakukan permintaan 5 kali 3 teratas, bukan? Jika demikian, mungkin ada opsi lain yang menggunakan WordPress API?
Lebih baik Menggunakan API Transien untuk Caching?
Saya menganggap posting Anda tidak akan sering berubah, benar? Bagaimana jika Anda menerima tiga (3) permintaan klik secara berkala dan kemudian cache hasilnya menggunakan API Transients ? Anda akan mendapatkan kode yang dapat dipelihara dan kinerja hebat; sedikit lebih baik daripada
UNION
permintaan di atas karena WordPress akan menyimpan daftar posting sebagai array serial dalam satu catatanwp_options
tabel.Anda dapat mengambil contoh berikut dan memasukkannya ke root situs web Anda
test.php
untuk mengujinya:Ringkasan
Sementara ya Anda bisa melakukan apa yang Anda minta menggunakan
UNION
kueri SQL danposts_join
kait filter yang mungkin lebih baik Anda tawarkan menggunakan caching dengan Transients API .Semoga ini membantu?
sumber
WP_Query()
tidak mendukung sesuatu seperti First X For Each Cat . Alih-alihWP_Query()
Anda dapat menggunakanget_posts()
pada masing-masing kategori Anda, jadi katakan tiga kali:$posts
sekarang berisi lima posting pertama untuk setiap kategori.sumber
Saya tidak tahu cara untuk mendapatkan lima posting pertama untuk masing-masing kategori dalam satu permintaan. Jika Anda hanya akan memiliki 45 posting, lalu tekan database sekali dan dapatkan lima posting Anda untuk setiap kategori mungkin merupakan pendekatan yang paling efisien. Memukul database tiga kali dan menggabungkan hasilnya bukanlah hal yang buruk.
sumber