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.


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.


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


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.