Regenerar babosas del título de las publicaciones

14

¿Es posible regenerar las babosas mediante programación después de cambiar los títulos de la publicación? Se actualizaron numerosos títulos de publicaciones y la babosa no se actualizó con el título, así que necesito regenerar todas estas babosas.

Nicola Peluchetti
fuente
He tenido que hacer esto varias veces y descubrí que entre diferentes entornos de servidor donde no puede manejar matrices grandes (con número de entradas configuradas en ilimitado) ni llamar a wp_update_post repetidamente con un gran consumo de memoria que lo divide en una llamada WP_Query con paginación y uso $ wpdb que es más manejable y eficiente. Proporcioné el código de muestra en una publicación similar .
codearachnid

Respuestas:

17

Sí, es posible.

Código de muestra, debe ser probado y refinado:

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

Acabo de inventar esto, probablemente hay algunos errores y casos egde, pero debería darte una idea. Además, esto puede llevar un tiempo, por lo que podría ser útil dividir la actualización en fragmentos más pequeños.

fuxia
fuente
1
Hmmm ... desde mi experiencia, esto no funciona. El post_nameargumento es ignorado por wp_update_post, al menos en la versión 3.9 del núcleo
Alexandre Bourlier, el
Actualmente, post_namese ignora dentro de la wp_update_post()función, pero se tiene en cuenta cuando la publicación de actualización llama a la wp_insert_post()función: esto significa que pasar el nuevo slug a la actualización dará como resultado un cambio efectivo para que la publicación se actualice.
Erenor Paz
1

Estaba probando el método sugerido por Toscho, que es el "instintivo", pero en muchos casos no funciona (vea el código central para entender lo que quiero decir con "muchos casos").

Mirando el código, encontré el wp_insert_post_datagancho de filtro, llamado por la wp_update_postfunción justo antes de insertar el mensaje en la base de datos.

Al llamar a este filtro y cambiar el valor de $data['post_name'], pude hacer que esto funcione correctamente. Wordpress es genial pero está tan mal documentado ...

Edité la documentación , para que más personas puedan encontrar esta solución si es necesario.

Alexandre Bourlier
fuente
¿Puedes señalar por qué wp_update_post sobrescribe el post_name? La única razón por la que veo que esto suceda es si el usuario que intenta modificar el post_name es solo un contribuyente (o el mismo nivel) en cuyo caso no debería permitir que ese usuario cambie la babosa, ¿encontró algún otro caso en el que el post_name se sobrescribe?
jnhghy - Alexandru Jantea
Sí, esta es la forma correcta de hacerlo. Gracias @Alexandre
user88731
-1

puede hacerlo directamente en mysql si lo necesita. (nuestro sitio de woocommerce tiene cientos de miles de productos):

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

donde post_type = 'producto': eso mantendrá su actualización solo para productos de comercio electrónico; debe averiguar qué límites desea mantener en esta consulta.

iateadonut
fuente