Rigenera le lumache dal titolo dei post


14

è possibile rigenerare le lumache in modo programmatico dopo aver modificato i titoli del post? Numerosi titoli post sono stati aggiornati e la lumaca non è stata aggiornata con il titolo, quindi ho bisogno di rigenerare tutte queste lumache.


Ho dovuto farlo diverse volte e ho scoperto che tra diversi ambienti server in cui non è in grado di gestire array di grandi dimensioni (con i posizionamenti numerici impostati su illimitati) né di chiamare ripetutamente wp_update_post con un elevato consumo di memoria che lo ha suddiviso in una chiamata WP_Query con impaginazione e utilizzo $ wpdb è più gestibile e performante. Ho fornito l' esempio di codice su un post simile .
codearachnid,

Risposte:


17

Sì, è possibile.

Codice di esempio, deve essere testato e perfezionato:

// 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
            )
        );
    }
}

Ho appena inventato questo, probabilmente ci sono alcuni errori e casi egde, ma dovrebbe darti un'idea. Inoltre, ciò potrebbe richiedere del tempo, quindi potrebbe essere utile dividere l'aggiornamento in blocchi più piccoli.


1
Hmmm ... dalla mia esperienza, questo non funziona. L' post_nameargomento è ignorato dal wp_update_post, almeno nella versione 3.9 del core
Alexandre Bourlier,

Attualmente, post_nameviene ignorato all'interno della wp_update_post()funzione, ma viene preso in considerazione quando il post di aggiornamento richiede la wp_insert_post()funzione: ciò significa che il passaggio del nuovo slug all'aggiornamento comporterà una modifica effettiva per il post da aggiornare.
Erenor Paz,


1

Stavo provando il metodo suggerito da Toscho, che è "istintivo", ma in molti casi non funziona (vedi il codice di base per ottenere ciò che intendo con "molti casi").

Guardando nel codice, ho trovato l' wp_insert_post_datahook del filtro, chiamato dalla wp_update_postfunzione prima di inserire il messaggio nel database.

Chiamando questo filtro e cambiando il valore di $data['post_name'], sono stato in grado di farlo funzionare correttamente. Wordpress è bello ma così mal documentato ...

Ho modificato la documentazione , in modo che più persone possano trovare questa soluzione alternativa, se necessario.


Puoi indicare perché wp_update_post sovrascrive post_name? l'unico motivo per cui vedo che ciò accade è se l'utente che cerca di modificare post_name è solo un collaboratore (o lo stesso livello) nel qual caso non dovrebbe consentire a quell'utente di cambiare lumaca, hai trovato altri casi in cui il post_name è sovrascritto?
jnhghy - Alexandru Jantea,

Sì, questo è il modo corretto di farlo. Grazie @Alexandre
user88731

-1

puoi farlo direttamente in mysql se ne hai bisogno. (il nostro sito di woocommerce ha centinaia di migliaia di prodotti):

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';

dove post_type = 'product' - che manterrà l'aggiornamento solo ai prodotti di woocommerce; dovresti capire quali limiti vuoi mantenere su questa query.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.