¿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.
¿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.
Respuestas:
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.
post_name
argumento es ignorado por wp_update_post
, al menos en la versión 3.9 del núcleo
post_name
se 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.
Este complemento también hace el trabajo: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs
Sin embargo, como solo lo hace para publicaciones que aún no tienen una babosa, si necesita regenerar las babosas edite la siguiente línea en el complemento:
if ($post->post_name == "") {
por ejemplo, puede cambiarlo a:
if (true) {
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_data
gancho de filtro, llamado por la wp_update_post
funció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.
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.