Saat ini saya mencoba menampilkan daftar judul musik dan ingin menyortir mengabaikan (tetapi masih menampilkan) artikel awal dari judul.
Sebagai contoh jika saya memiliki daftar band itu akan ditampilkan secara alfabet di WordPress seperti ini:
- Sabat hitam
- Dipimpin Zeppelin
- Pink Floyd
- The Beatles
- Kinks
- Batu berputar
- Lizzy Tipis
Alih-alih, saya ingin menampilkannya sesuai abjad sambil mengabaikan artikel awal 'The', seperti ini:
- The Beatles
- Sabat hitam
- Kinks
- Dipimpin Zeppelin
- Pink Floyd
- Batu berputar
- Lizzy Tipis
Saya menemukan solusi dalam entri blog dari tahun lalu , yang menyarankan kode berikut dalam functions.php
:
function wpcf_create_temp_column($fields) {
global $wpdb;
$matches = 'The';
$has_the = " CASE
WHEN $wpdb->posts.post_title regexp( '^($matches)[[:space:]]' )
THEN trim(substr($wpdb->posts.post_title from 4))
ELSE $wpdb->posts.post_title
END AS title2";
if ($has_the) {
$fields .= ( preg_match( '/^(\s+)?,/', $has_the ) ) ? $has_the : ", $has_the";
}
return $fields;
}
function wpcf_sort_by_temp_column ($orderby) {
$custom_orderby = " UPPER(title2) ASC";
if ($custom_orderby) {
$orderby = $custom_orderby;
}
return $orderby;
}
dan kemudian membungkus kueri dengan add_filter
sebelum danremove_filter
sesudah.
Saya sudah mencoba ini, tetapi saya terus mendapatkan kesalahan berikut di situs saya:
Kesalahan basis data WordPress: [Kolom 'title2' tidak dikenal di 'urutan klausa']
SELECT wp_posts. * FROM wp_posts WHERE 1 = 1 AND wp_posts.post_type = 'rilis' AND (wp_posts.post_status = 'publikasikan' ATAU wp_posts.post_status = 'pribadi') ORDER OLEH DASAR (title2) ASC
Saya tidak akan berbohong, saya cukup baru di bagian php WordPress, jadi saya tidak yakin mengapa saya mendapatkan kesalahan ini. Saya bisa melihat itu ada hubungannya dengan kolom 'title2', tapi itu pemahaman saya bahwa fungsi pertama harus mengurus itu. Juga, jika ada cara yang lebih cerdas untuk melakukan ini saya semua telinga. Saya sudah googling di sekitar dan mencari situs ini, tetapi saya belum benar-benar menemukan banyak solusi.
Kode saya menggunakan filter terlihat seperti ini jika ada bantuan:
<?php
$args_post = array('post_type' => 'release', 'orderby' => 'title', 'order' => 'ASC', 'posts_per_page' => -1, );
add_filter('post_fields', 'wpcf_create_temp_column'); /* remove initial 'The' from post titles */
add_filter('posts_orderby', 'wpcf_sort_by_temp_column');
$loop = new WP_Query($args_post);
remove_filter('post_fields', 'wpcf_create_temp_column');
remove_filter('posts_orderby', 'wpcf_sort_by_temp_column');
while ($loop->have_posts() ) : $loop->the_post();
?>
Jawaban:
Masalah
Saya pikir ada kesalahan ketik di sana:
Nama filternya
posts_fields
bukanpost_fields
.Itu bisa menjelaskan mengapa
title2
bidang tidak diketahui, karena definisi itu tidak ditambahkan ke string SQL yang dihasilkan.Alternatif - Filter tunggal
Kami dapat menulis ulang untuk menggunakan hanya satu filter:
di mana Anda sekarang dapat mengaktifkan pemesanan khusus dengan
_custom
parameter orderby:Alternatif - Rekursif
TRIM()
Mari kita terapkan ide rekursif oleh Pascal Birchler , berkomentar di sini :
di mana kita dapat misalnya membangun fungsi rekursif sebagai:
Ini artinya
akan menghasilkan:
Alternatif - MariaDB
Secara umum saya suka menggunakan MariaDB, bukan MySQL . Maka itu jauh lebih mudah karena MariaDB 10.0.5 mendukung
REGEXP_REPLACE
:sumber
functions.php
dan menyebutnya melaluiorderby
ketika saya membutuhkannya. Solusi hebat - terima kasih :-)Cara yang lebih mudah adalah melalui dan mengubah slug permalink pada postingan yang membutuhkannya (di bawah judul pada layar tulisan postingan) dan kemudian gunakan saja untuk memesan alih-alih judul.
yaitu. gunakan
post_name
bukanpost_title
untuk menyortir ...Ini juga berarti bahwa permalink Anda mungkin berbeda jika Anda menggunakan% postname% dalam struktur permalink Anda, yang bisa menjadi bonus tambahan.
misalnya. memberi
http://example.com/rolling-stones/
tidakhttp://example.com/the-rolling-stones/
Sunting : kode untuk memperbarui siput yang ada, menghapus awalan yang tidak diinginkan dari
post_name
kolom ...sumber
EDIT
Saya sedikit memperbaiki kode. Semua blok kode diperbarui sesuai. Hanya catatan sebelum melompat ke pembaruan di JAWABAN ASLI , saya telah menyiapkan kode untuk bekerja dengan yang berikut ini
Jenis pos khusus ->
release
Taksonomi khusus ->
game
Pastikan untuk mengatur ini sesuai dengan kebutuhan Anda
JAWABAN ASLI
Selain jawaban lain dan kesalahan ketik yang ditunjukkan oleh @Birgire, berikut adalah pendekatan lain.
Pertama, kita akan menetapkan judul sebagai bidang khusus tersembunyi, tetapi pertama-tama kita akan menghapus kata-kata seperti
the
yang ingin kita kecualikan. Sebelum kita melakukan itu, kita harus terlebih dahulu membuat fungsi pembantu untuk menghapus kata-kata yang dilarang dari nama istilah dan memposting judulSekarang kita sudah membahasnya, mari kita lihat potongan kode untuk mengatur bidang khusus kita. Anda harus menghapus kode ini sepenuhnya begitu Anda telah memuat halaman apa saja sekali. Jika Anda memiliki situs besar dengan banyak posting, Anda dapat mengatur
posts_per_page
sesuatu untuk100
dan menjalankan skrip beberapa kali sampai semua posting memiliki bidang khusus telah ditetapkan untuk semua postingSekarang setelah bidang khusus diatur ke semua posting dan kode di atas dihapus, kami perlu memastikan bahwa kami mengatur bidang khusus ini untuk semua posting baru atau setiap kali kami memperbarui judul posting. Untuk ini kita akan menggunakan
transition_post_status
pengait. Kode berikut dapat masuk ke plugin ( yang saya sarankan ) atau difunctions.php
MENGUMPULKAN POS ANDA
Anda dapat menjalankan kueri Anda seperti biasa tanpa filter khusus. Anda dapat meminta dan mengurutkan posting Anda sebagai berikut
sumber
jawaban birgire berfungsi baik saat memesan hanya dengan bidang ini. Saya membuat beberapa modifikasi agar berfungsi ketika memesan dengan berbagai bidang (Saya tidak yakin itu berfungsi dengan benar ketika pemesanan judul adalah yang utama):
sumber