2012-07-30 36 views
5

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

Respuesta

2

1) Crear una nueva página y asignar una nueva plantilla de página a la misma, digamos site.com/update y update.php. Dentro de update.php escribir mecanismo granel:

<?php // grab all your posts 
$parts = get_posts(array('post_type' => 'parts', 'numberposts' => -1,)) 

// loop through every part 
foreach ($parts as $part) { 

    // get part number 
    $partno = get_post_meta($part->ID, 'parto', true); 

    $updated_post = array(); 
    $updated_post['ID'] = $part->ID; 
    $updated_post['post_name'] = $partno; 
    wp_update_post($updated_post); // update existing posts 

} ?> 

Se podría colocar en cualquier lugar en su tema, pero me gusta crear una página para que para que pueda ejecutar fácilmente una tarea programada con él.

A continuación, la función para cambiar la babosa de cada puesto de nueva creación:

<?php function change_default_slug($id) { 

    // get part number 
    $partno = get_post_meta($id, 'parto', true); 
    $post_to_update = get_post($id); 

    // prevent empty slug, running at every post_type and infinite loop 
    if ($partno == '' || $post_to_update['post_type'] != 'parts' || $post_to_update['post_name'] == $partno) 
     return; 

    $updated_post = array(); 
    $updated_post['ID'] = $id; 
    $updated_post['post_name'] = $partno; 
    wp_update_post($updated_post); // update newly created post 

} 
add_action('save_post', 'change_default_slug'); ?> 

El código anterior se ejecuta cada vez que un mensaje se guarda (por ejemplo, cuando se publicó por primera vez) y establece un nuevo post_name a la parte no.

+0

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. –

+0

Bien, descubrí la respuesta que wp_update_post realmente tiene en cuenta. Verificará el nombre de la publicación para duplicados. –

Cuestiones relacionadas