Regeneruj ślimaki z tytułu postów

14

czy możliwe jest programowe zregenerowanie ślimaków po zmianie tytułów postu? Liczne tytuły postów zostały zaktualizowane, a ślimak nie został zaktualizowany tytułem, więc muszę zregenerować wszystkie te ślimaki.

Nicola Peluchetti
źródło
Musiałem to zrobić kilka razy i stwierdziłem, że między różnymi środowiskami serwerowymi, w których nie może on obsługiwać dużych tablic (z ustawionymi liczbami nieograniczonymi), ani też wielokrotnego wywoływania wp_update_post przy dużym zużyciu pamięci, które dzielą go na wywołanie WP_Query z paginacją i używaniem $ wpdb, że jest łatwiejszy w zarządzaniu i bardziej wydajny. I pod warunkiem, że przykładowy kod na podobnym stanowisku .
codearachnid

Odpowiedzi:

17

Tak to mozliwe.

Przykładowy kod musi zostać przetestowany i dopracowany:

// get all posts
$posts = get_posts( array (  'numberposts' => -1 ) );

foreach ( $posts as $post )
{
    // check the slug and run an update if necessary 
    $new_slug = sanitize_title( $post->post_title );
    if ( $post->post_name != $new_slug )
    {
        wp_update_post(
            array (
                'ID'        => $post->ID,
                'post_name' => $new_slug
            )
        );
    }
}

Właśnie to wymyśliłem, prawdopodobnie są jakieś błędy i np. Przypadki, ale powinno to dać ci pomysł. Może to także chwilę potrwać, więc warto podzielić aktualizację na mniejsze części.

fuxia
źródło
1
Hmmm ... z mojego doświadczenia, to nie działa. post_nameArgumentem jest ignorowany przez wp_update_post, co najmniej w wersji rdzenia 3,9
Alexandre Bourlier
Obecnie post_namejest ignorowany w ramach wp_update_post()funkcji, ale jest brany pod uwagę, gdy post z aktualizacją wywołuje wp_insert_post()funkcję: oznacza to, że przekazanie nowego ślimaka do aktualizacji spowoduje efektywną zmianę go dla aktualizowanego postu.
Erenor Paz
2

Ta wtyczka wykonuje również zadanie: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs

Jednak, podobnie jak w przypadku postów, które nie mają jeszcze ślimaka, jeśli chcesz zregenerować ślimaki, edytuj następujący wiersz we wtyczce:

if ($post->post_name == "") {

na przykład możesz zmienić to na:

if (true) {

Lessan Vaezi
źródło
1

Próbowałem metody zaproponowanej przez Toscho, która jest „instynktowna”, ale w wielu przypadkach nie działa (por. Kod podstawowy, aby uzyskać to, co rozumiem przez „wiele przypadków”).

Przeglądając kod, znalazłem wp_insert_post_datahak filtra, wywołany przez wp_update_postfunkcję tuż przed wstawieniem postu iunto do bazy danych.

Po wywołaniu tego filtra i zmianie wartości $data['post_name']udało mi się sprawić, aby działał poprawnie. Wordpress jest fajny, ale tak źle udokumentowany ...

Zredagowałem dokumentację , aby w razie potrzeby więcej osób mogło znaleźć to obejście.

Alexandre Bourlier
źródło
Czy możesz wskazać, dlaczego wp_update_post nadpisuje nazwę post? jedyny powód, dla którego to widzę, jest taki, że jeśli użytkownik próbuje zmodyfikować nazwę postu, jest tylko współautorem (lub tym samym poziomem), w którym to przypadku nie powinien zezwalać temu użytkownikowi na zmianę ślimaka, czy znalazłeś inne przypadki, w których post_name jest nadpisany?
jnhghy - Alexandru Jantea
Tak, jest to właściwy sposób, aby to zrobić. Dziękuję @Alexandre
user88731,
-1

możesz to zrobić bezpośrednio w mysql, jeśli potrzebujesz. (nasza strona woocommerce zawiera setki tysięcy produktów):

update wp_posts set post_name = concat(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower(post_title), '"', ''), "'", ''), ",", '-'), " ", '-'), "&", ''), ";", ''), "@", ''), ".", ''), ":", ''), "/", ''), "+", ''), "(", ''), ")", ''), "--", '-'), "---", '-'), "--", '-'), "--", '-'), '-', id) where post_type = 'product';

gdzie post_type = 'product' - dzięki temu Twoja aktualizacja będzie zawierać tylko produkty woocommerce; powinieneś dowiedzieć się, jakie ograniczenia chcesz zachować dla tego zapytania.

iateadonut
źródło