Salut!
In activitatea de intretinere a unui site web executat in WordPress, programatorul se poate confrunta cu o sarcina de restructurare a categoriilor existente.
Unele categorii vor fi eliminate, unele comasate, altele adaugate.
Efectuarea acestei sarcini se poate face partial din adminul site-ului. Partea cea mai importanta este atribuirea unor categorii noi la articolele dintr-o anumita categorie si eventual separarea acelor articole de categoria initiala, care eventual va fi eliminata.
In acest scop exista si plugin-uri dar riscul este evident: poti sa risti sa pierzi mii de articole ale unui site ca animalzoo.ro sau starjunior.ro sau doctorulzilei.ro mizand pe un plugin public gratuit? Eu nu am facut-o si nu recomand nimanui aceasta abordare riscanta!
Asadar ramane solutia custom: un script de serviciu care executa aceste schimbari.
Schematic, acest script care “trece” articole de la o categorie intiala la alta intr-un site realizat pe WordPress puncteaza urmatoarele actiuni:
- adauga categorii noi in admin (eventual)
- selecteaza toate articolele categoriei intiale
- parcurge setul de articole
- pentru fiecare articol obtine id-urile categoriilor atribuite lui
- reseteaza setul de categorii atribuite astfel:
- elimina categoria initiala (eventual)
- adauga categorii noi
- sterge categoriile inutile din admin
Hai sa vedem scriptul. (Atentie, a rulat cu succes pe site-urile web Wordpress Animalzoo.ro, Starjunior.ro, Doctorulzilei.ro si EVZMonden.ro cu pretul unui efort obisnuit de lucru)
$term_old = 333;
$taxonomy = 'category';
$post_type_old = 'post';
//termeni de exclus
$termeni_de_exclus = array();
//se exclude term_old implicit
$termeni_de_exclus[] = $term_old;
//termeni de atasat
$termeni_de_atasat = array();
$termeni_de_atasat[] = array('term_id' => 777, 'taxonomy' => 'category');
tcp_atasez_termen_taxonomie_nou_la_articol($term_old, $post_type_old, $taxonomy, $termeni_de_atasat, $termeni_de_exclus);
function tcp_atasez_termen_taxonomie_nou_la_articol($term_old, $post_type_old, $taxonomy, $termeni_de_atasat, $termeni_de_exclus){
$args = array();
//get $taxonomy, $taxonomy_new
//daca $term_old apartine taxonomiei 'categorie'
if ($taxonomy=='category'){
$args['cat'] = $term_old;
$args['post_type'] = $post_type_old;
$args['posts_per_page'] = -1;
}else{
//daca $term_old apartine unei alte taxonomii decat 'categorie'
$args = array(
'post_type' => $post_type_old,
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'field' => 'id',
'terms' => array($term_old),
'operator' => 'IN',
),
),
);
}
// obtin articolele coresp argumentelor de interogare ($args array)
$set_articole = new WP_Query($args);
//obtin toate numele taxonomiilor inregistrate (custom si builtin)
$taxonomies = get_taxonomies();
$i = 0;
while ($set_articole->have_posts()): $set_articole->the_post();
//efectuez operatia de mutare articole de la un termen la altul pentru seturi de 300 de articole
if ($i <= 300){
$termeni_pastrati = array();
$tax_termeni_pastrati = array();
$post_id = $set_articole->post->ID;
//obtin categoriile articolului
$termeni = wp_get_object_terms( $post_id, $taxonomies );
foreach($termeni as $termen){
//determin toti termenii de pastrat
if (!in_array($termen->term_id, $termeni_de_exclus)){
$termeni_pastrati[] = $termen->term_id;
$tax_termeni_pastrati[$termen->term_id] = $termen->taxonomy;
}
}
//adaug termenii noi pe care vreau sa-i atasez articolului
foreach($termeni_de_atasat as $termena){
$termeni_pastrati[] = $termena['term_id'];
$tax_termeni_pastrati[$termena['term_id']] = $termena['taxonomy'];
}
//trec la tipul integer id-urile termenilor de pastrat din vectorul care ii contine
$termeni_pastrati = array_map( 'intval', $termeni_pastrati );
//atasez termenii la articol, prin inlocuirea tuturor termenilor intiali cu cei din vectorul de termeni construit (in care nu este prevazut termenul initial, in acest exemplu)
foreach($termeni_pastrati as $termenp){
$term_taxonomy_ids = wp_set_object_terms( $post_id, $termenp, $tax_termeni_pastrati[$termenp], false );
if ( is_wp_error( $term_taxonomy_ids ) ) {
echo $post_id . 'There was an error somewhere and the terms couldn\'t be set. ' . $i . ' <br />';
} else {
echo $post_id . 'Success! The post\'s categories were set. ' . $i . ' <br />';
}
}
}
$i++;
endwhile;
echo 'Total procesate' . $i;
wp_reset_query();
}
Am comentat unele linii de cod si se pot recunoaste toate etapele codului descrise mai sus.
Cele 2 funcii cheie sunt:
1. //obtin termenii taxonomici ai articolului
$termeni = wp_get_object_terms( $post_id, $taxonomies );
2. // atribui un termen taxonomic articolului
$term_taxonomy_ids = wp_set_object_terms( $post_id, $termenp, $tax_termeni_pastrati[$termenp], false );
Parametrul $append=false indica faptul ca termenii sunt inlocuiti, nu adaugati. Si cred ca are un viciu acest script: pentru un singur termen taxonomic nou functioneaza, dar opentru mai multi, ca rezultat articolul se va atribui ultimului termen din vectorul $tax_termeni_pastrati;
Corectarea este: la prima rulare $append = false ca sa eliminam termenul intial atribuit articolului, iar la urmatoarele rulari $append=true ca sa adaugam la primul termen nou urmatorii termeni noi
La revedere pana la umatorul articol!
Află detalii privind realizarea site-urilor pe WordPress
Creare site WordPress
Sau ia legatura cu noi aici