Básicamente tengo una configuración de tipo de publicación personalizada llamada "Partes" con más de 5.000 publicaciones actualmente en ella. Hay una serie de campos personalizados asociados con cada parte, incluido un "número de parte". En la actualidad, la URL de cada parte es:Reescriba a granel las barras de publicación basadas en el valor de campo personalizado en Wordpress
http://site.com/parts/name-of-part/
Lo que yo preferiría tener es:
http://site.com/parts/XXXX-608-AB/ (Eso es un número de pieza, se almacena como un campo personalizado "N º art".)
Creo que necesito hacer dos cosas:
1) Crear un script para editar a granel todos los slugs para cada parte existente, en función del campo personalizado "partno".
2) Enganche en una función de WordPress para activarlo para que siempre cree la babosa para piezas nuevas en función del campo personalizado "partno".
¿Alguien tiene conocimiento de cómo lograr uno o ambos aspectos?
ACTUALIZACIÓN: A continuación se muestra el código que terminé usando para el cambio de los puestos existentes
// Set max posts per query
$max = 500;
$total = 5000;
for($i=0;$i<=$total;$i+=$max) {
$parts = get_posts(array('post_type' => 'parts', 'numberposts' => $max, 'offset' => $i));
// loop through every part
foreach ($parts as $part) {
// get part number
$partno = get_post_meta($part->ID, 'partno', true);
$updated_post = array();
$updated_post['ID'] = $part->ID;
$updated_post['post_name'] = $partno;
wp_update_post($updated_post); // update existing posts
echo $part->ID;
}
}
ACTUALIZACIÓN: A continuación se muestra el código que utilicé en functions.php para cambiar los puestos actuales (gracias en parte a https://wordpress.stackexchange.com/questions/51363/how-to-avoid-infinite-loop-in-save-post-callback)
add_action('save_post', 'my_custom_slug');
function my_custom_slug($post_id) {
//Check it's not an auto save routine
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
return;
//Perform permission checks! For example:
if (!current_user_can('edit_post', $post_id))
return;
//If calling wp_update_post, unhook this function so it doesn't loop infinitely
remove_action('save_post', 'my_custom_slug');
//call wp_update_post update, which calls save_post again. E.g:
if($partno != '')
wp_update_post(array('ID' => $post_id, 'post_name' =>get_post_meta($post_id,'partno',true)));
// re-hook this function
add_action('save_post', 'my_custom_slug');
}
Esto se ve genial! Voy a intentar implementar ahora. Una pregunta más: ¿hay alguna forma de prevenir la duplicación accidental? Por ejemplo, ¿qué sucede si el número de parte es el mismo para dos partes? Supongo que wp_update_post no tiene eso en cuenta. –
Bien, descubrí la respuesta que wp_update_post realmente tiene en cuenta. Verificará el nombre de la publicación para duplicados. –