Acasă » Blog » WordPress – Script pentru atribuire articole existente la categorii noi

WordPress – Script pentru atribuire articole existente la categorii noi

Share this post on social!

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:

  1. adauga categorii noi in admin (eventual)
  2. selecteaza toate articolele categoriei intiale
  3. 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
  4. 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!

 

 

 

 

 

 

Traian Constantin Predan

Traian Constantin Predan

Inginer absolvent al Politehnicii București proiectează și construiește sisteme online. Lucrează proiecte extrem de diverse, îi plac viziunile noi care provoacă la dezvoltarea unor soluții tehnice eficiente și stabile.