è 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.
è 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.
Risposte:
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.
post_name
argomento è ignorato dal wp_update_post
, almeno nella versione 3.9 del core
post_name
viene 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.
Questo plugin fa anche il lavoro: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs
Tuttavia, poiché lo fa solo per i post che non hanno ancora una lumaca, se hai bisogno di rigenerare le lumache modifica la seguente riga nel plugin:
if ($post->post_name == "") {
ad esempio, puoi cambiarlo in:
if (true) {
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_data
hook del filtro, chiamato dalla wp_update_post
funzione 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 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.