2012-07-30 7 views
5

Zasadniczo mam niestandardową konfigurację typu postu o nazwie "Części" z ponad 5000 wpisów w niej obecnie. Z każdą częścią jest przypisanych kilka niestandardowych pól, w tym "numer części". Obecnie URL dla poszczególnych części wynosi:Napisy masowe po przerobie na podstawie wartości pola niestandardowego w Wordpress

http://site.com/parts/name-of-part/

Co wolałbym mieć to:

http://site.com/parts/XXXX-608-AB/ (to numer części, przechowywane jako pole niestandardowe "Nr kat.")

Uważam, że muszę zrobić dwie rzeczy:

1) Utwórz skrypt do zbiorczej edycji wszystkich wtyczek dla każdej istniejącej części, w oparciu o niestandardowe pole "partno".

2) Podłącz się do funkcji Wordpress, aby wywołać tę funkcję, aby zawsze tworzyć korek dla nowych części w oparciu o niestandardowe pole "partno".

Czy ktoś ma wiedzę na temat sposobu osiągnięcia jednego lub obu tych aspektów?

UPDATE: Poniżej znajduje się kod skończyło się stosując na zmianę istniejących stanowisk

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

UPDATE: Poniżej znajduje się kod użyłem w functions.php zmienić trwającego posty (po części dzięki do 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'); 
} 

Odpowiedz

2

1) Utwórz nową stronę i przypisać nowy szablon strony do niego, powiedzmy site.com/update i update.php. Wewnątrz update.php napisać Ci mechanizm zbiorczego:

<?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 

} ?> 

można umieścić w dowolnym miejscu w tym temacie, ale chciałbym, aby stworzyć stronę dla że tak można łatwo uruchomić zadanie cron z nim.

Następny funkcja zmienić ślimak każdego nowo utworzone stanowisko:

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

Powyższy kod jest uruchamiany za każdym razem post zostanie zapisany (np kiedy opublikowano po raz pierwszy) i wyznacza nowy POST_NAME do nr części

+0

To wygląda świetnie! Postaram się teraz wdrożyć. Jeszcze jedno pytanie: czy istnieje sposób zapobiegania przypadkowemu powielaniu? Na przykład, co się dzieje, gdy numer części jest taki sam dla dwóch części? Zakładam, że wp_update_post nie bierze tego pod uwagę. –

+0

Okay, dowiedziałem się, że wp_update_post rzeczywiście to uwzględnia. Sprawdza nazwę post_name dla duplikatów. –

Powiązane problemy