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();
?>
Odpowiedzi:
Problem
Myślę, że jest tam literówka:
Nazwa filtra
posts_fields
nie jestpost_fields
.To może wyjaśniać, dlaczego
title2
pole jest nieznane, ponieważ jego definicja nie jest dodawana do generowanego ciągu SQL.Alternatywa - pojedynczy filtr
Możemy przepisać go, aby używał tylko jednego filtra:
gdzie możesz teraz aktywować niestandardowe zamówienie za pomocą
_custom
parametru orderby:Alternatywa - rekurencyjna
TRIM()
Zaimplementujmy rekurencyjny pomysł Pascala Birchlera , skomentowany tutaj :
gdzie możemy na przykład skonstruować funkcję rekurencyjną jako:
To znaczy że
wygeneruje:
Alternatywa - MariaDB
Ogólnie lubię używać MariaDB zamiast MySQL . Jest to o wiele łatwiejsze, ponieważ MariaDB 10.0.5 obsługuje
REGEXP_REPLACE
:źródło
functions.php
i wywoływać go,orderby
kiedy go potrzebuję. Świetne rozwiązanie - dziękuję :-)Łatwiejszym sposobem może być przejście i zmiana ślimaka permalink na tych postach, które go potrzebują (pod tytułem na ekranie pisania postów), a następnie po prostu użyj tego do zamawiania zamiast tytułu.
to znaczy.
post_name
nie używajpost_title
do sortowania ...Oznaczałoby to również, że twój bezpośredni link może być inny, jeśli użyjesz% postname% w swojej strukturze bezpośredniego łącza, co może być dodatkową premią.
na przykład.
http://example.com/rolling-stones/
nie dajehttp://example.com/the-rolling-stones/
EDYCJA : kod aktualizujący istniejące ślimaki, usuwający niechciane prefiksy z
post_name
kolumny ...źródło
EDYTOWAĆ
Trochę poprawiłem kod. Wszystkie bloki kodu są odpowiednio aktualizowane. Tylko uwaga, zanim wskoczyłem do aktualizacji w ORYGINALNEJ ODPOWIEDZI , skonfigurowałem kod do pracy z następującymi
Niestandardowy typ postu ->
release
Niestandardowa taksonomia ->
game
Upewnij się, że ustawiłeś to zgodnie ze swoimi potrzebami
ORYGINALNA ODPOWIEDŹ
Oprócz innych odpowiedzi i literówki wskazanej przez @birgire, oto inne podejście.
Najpierw ustawimy tytuł jako ukryte pole niestandardowe, ale najpierw usuniemy takie słowa
the
, które chcielibyśmy wykluczyć. Zanim to zrobimy, musimy najpierw utworzyć funkcję pomocnika, aby usunąć zakazane słowa z nazw terminów i tytułów postówTeraz, gdy już to omówiliśmy, spójrzmy na fragment kodu, aby ustawić nasze niestandardowe pole. Musisz usunąć ten kod całkowicie, gdy tylko załadujesz dowolną stronę. Jeśli masz ogromną witrynę z mnóstwem postów, możesz ustawić
posts_per_page
coś100
i uruchomić skrypty kilka razy, dopóki wszystkie posty nie będą miały niestandardowego pola dla wszystkich postówTeraz, gdy pola niestandardowe są ustawione na wszystkie posty, a powyższy kod został usunięty, musimy upewnić się, że ustawiliśmy to niestandardowe pole na wszystkie nowe posty lub za każdym razem, gdy aktualizujemy tytuł postu. Do tego użyjemy
transition_post_status
haka. Poniższy kod może przejść do wtyczki ( którą polecam ) lub do twojejfunctions.php
PYTANIE O SWOJE POCZTY
Możesz uruchamiać swoje zapytania normalnie, bez żadnych niestandardowych filtrów. Możesz wyszukiwać i sortować swoje posty w następujący sposób
źródło
Odpowiedzi birgire'a działają dobrze przy zamawianiu tylko według tego pola. Wprowadziłem pewne modyfikacje, aby działały przy zamawianiu według wielu pól (nie jestem pewien, czy działa poprawnie, gdy porządkowanie tytułów jest podstawowym):
źródło