Regeneriere Schnecken aus dem Titel der Beiträge

14

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.

Nicola Peluchetti
quelle
Ich musste dies mehrere Male tun und fand heraus, dass zwischen verschiedenen Serverumgebungen, in denen es keine großen Arrays verarbeiten kann (wobei die Anzahl der Einträge auf unbegrenzt gesetzt ist), noch wp_update_post wiederholt mit hohem Speicherverbrauch aufgerufen werden kann, was zu einem WP_Query-Aufruf mit Paginierung und Verwendung führt $ wpdb dass es übersichtlicher und performanter ist. Ich habe das Codebeispiel auf einem ähnlichen Beitrag bereitgestellt .
Codearachnid

Antworten:

16

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.

fuxia
quelle
1
Hmmm ... aus meiner Erfahrung funktioniert das nicht. Das post_nameArgument wird wp_update_postzumindest in der 3.9-Version des Kerns ignoriert
Alexandre Bourlier
Wird derzeit post_namein 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.
Erenor Paz
2

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) {

Lessan Vaezi
quelle
1

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_dataFilter-Hook gefunden, der von der wp_update_postFunktion 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.

Alexandre Bourlier
quelle
Können Sie erklären, warum wp_update_post den post_namen überschreibt? Der einzige Grund, warum ich dies sehe, ist, dass der Benutzer, der versucht, den post_name zu ändern, nur ein Mitwirkender (oder dieselbe Ebene) ist. In diesem Fall sollte es diesem Benutzer nicht möglich sein, den Slug zu ändern post_name wird überschrieben?
jnhghy - Alexandru Jantea
Ja, das ist der richtige Weg. Vielen Dank @Alexandre
user88731
-1

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.

iateadonut
quelle