Proiecte web

WordPress – Script pentru atribuire articole existente la categorii noi

By

Traian

PHP, Wordpress

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!

 

 

 

 

 

 

 

Comments are closed.