Ist es möglich, die Slugs nach dem Ändern der Titel des Posts programmgesteuert zu regenerieren? Zahlreiche Post-Titel wurden aktualisiert und der Slug wurde nicht mit dem Titel aktualisiert, sodass ich all diese Slugs neu generieren muss.
Ist es möglich, die Slugs nach dem Ändern der Titel des Posts programmgesteuert zu regenerieren? Zahlreiche Post-Titel wurden aktualisiert und der Slug wurde nicht mit dem Titel aktualisiert, sodass ich all diese Slugs neu generieren muss.
Antworten:
Ja, es ist möglich.
Beispielcode, muss getestet und verfeinert werden:
// 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
)
);
}
}
Ich habe das gerade erfunden, es gibt wahrscheinlich einige Fehler und Fehlerfälle, aber es sollte Ihnen eine Idee geben. Dies kann auch eine Weile dauern, so dass es nützlich sein kann, das Update in kleinere Teile aufzuteilen.
post_name
Argument wird wp_update_post
zumindest in der 3.9-Version des Kerns ignoriert
post_name
in der wp_update_post()
Funktion ignoriert , wird jedoch berücksichtigt, wenn der Aktualisierungsbeitrag die wp_insert_post()
Funktion aufruft. Dies bedeutet, dass die Übergabe des neuen Slugs an das Update dazu führt, dass dieser für den zu aktualisierenden Beitrag effektiv geändert wird.
Dieses Plugin erledigt auch die Aufgabe: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs
Da dies jedoch nur für Posts gilt, die noch keinen Slug haben, können Sie die folgende Zeile im Plugin bearbeiten, wenn Sie Slugs neu generieren müssen:
if ($post->post_name == "") {
Sie könnten es zum Beispiel ändern in:
if (true) {
Ich habe die von Toscho vorgeschlagene Methode ausprobiert, die "instinktiv" ist, aber in vielen Fällen funktioniert sie nicht (siehe den Kerncode, um zu verstehen, was ich unter "vielen Fällen" verstehe).
Beim Durchsuchen des Codes habe ich den wp_insert_post_data
Filter-Hook gefunden, der von der wp_update_post
Funktion direkt vor dem Einfügen des Posts in die Datenbank aufgerufen wurde.
Durch Aufrufen dieses Filters und Ändern des Werts von $data['post_name']
konnte ich dafür sorgen, dass dies ordnungsgemäß funktioniert. Wordpress ist cool, aber so schlecht dokumentiert ...
Ich habe die Dokumentation bearbeitet , damit bei Bedarf mehr Personen diese Problemumgehung finden.
Sie können dies direkt in MySQL tun, wenn Sie benötigen. (Auf unserer Woocommerce-Website finden Sie Hunderttausende von Produkten):
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';
where post_type = 'product' - Damit bleiben Ihre Updates nur für Woocommerce-Produkte erhalten. Sie sollten herausfinden, welche Grenzen Sie für diese Abfrage einhalten möchten.