Obecnie próbuję wygenerować listę tytułów muzycznych i chciałbym, aby sortowanie zignorowało (ale nadal wyświetlało) początkowy artykuł tytułu.
Na przykład, jeśli mam listę pasm, będzie wyświetlana alfabetycznie w WordPress w następujący sposób:
- Czarny Sabat
- Led Zeppelin
- Pink Floyd
- The Beatles
- The Kinks
- The Rolling Stones
- Thin Lizzy
Zamiast tego chciałbym, aby był wyświetlany alfabetycznie, ignorując początkowy artykuł „The”, w następujący sposób:
- The Beatles
- Czarny Sabat
- The Kinks
- Led Zeppelin
- Pink Floyd
- The Rolling Stones
- Thin Lizzy
Znalazłem rozwiązanie we wpisie na blogu z zeszłego roku , które sugeruje następujący kod w 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;
}
a następnie owijanie zapytania add_filter
przed i remove_filter
po.
Próbowałem tego, ale wciąż pojawia się następujący błąd w mojej witrynie:
Błąd bazy danych WordPress: [Nieznana kolumna „tytuł2” w „klauzuli porządku”]
WYBIERZ wp_posts. * FROM wp_posts GDZIE 1 = 1 ORAZ wp_posts.post_type = 'release' ORAZ (wp_posts.post_status = 'opublikuj' LUB wp_posts.post_status = 'prywatny') ORDER BY UPPER (title2) ASC
Nie będę kłamał, jestem całkiem nowy w części php WordPressa, więc nie jestem pewien, dlaczego otrzymuję ten błąd. Widzę, że ma to coś wspólnego z kolumną „title2”, ale rozumiałem, że pierwsza funkcja powinna się tym zająć. Ponadto, jeśli istnieje mądrzejszy sposób na zrobienie tego, jestem cały w uszach. Przeszukuję go i szukam w tej witrynie, ale tak naprawdę nie znalazłem wielu rozwiązań.
Mój kod używający filtrów wygląda tak, jeśli jest to jakaś pomoc:
<?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();
?>