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.
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.
Odpowiedzi:
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.
post_name
Argumentem jest ignorowany przez wp_update_post
, co najmniej w wersji rdzenia 3,9
post_name
jest 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.
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) {
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_data
hak filtra, wywołany przez wp_update_post
funkcję 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.
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.