web-dev-qa-db-fra.com

Comment relier 2 catégories (Sync)

Je veux que chaque fois qu'un utilisateur poste quelque chose dans la catégorie "Foo", le même contenu doit être dupliqué automatiquement dans la catégorie "Bar". Existe-t-il un tel plugin qui automatise le processus? Ou quelques PHP snippet? J'ai plusieurs catégories.

Ces catégories ne sont pas les catégories WordPress normales, elles sont personnalisées, pour un thème spécifique, comme les catégories WooCommerce par exemple. Le plugin doit donc supporter les taxonomies.

La raison en est que j'ai un site Web multilingue, utilisant le plugin Polylang, son contenu généré par l'utilisateur, le plus souvent, le contenu est le même dans les deux langues, il doit donc l'être dans les deux catégories. Si ce n'est pas le cas, l'administrateur traduira alors manuellement.

L'utilisateur insère le contenu toujours dans la catégorie anglaise, par exemple "Catégorie d'accueil", il doit être dupliqué automatiquement dans la catégorie "Casa" en espagnol, par exemple.

Notez que la deuxième langue est l’arabe, la première l’anglais, pour chaque catégorie d’anglais, il existe une catégorie arabe équivalente, chaque poste en anglais doit être inséré dans la catégorie arabe équivalente.

1
Lynob

Placez ceci dans vos fonctions de thème:

function mysite_clone_post($post_id, $post, $update) {
  if(!$update && in_category('home cat', $post)) {  //not handled updates and will only run if in this category
      $post_fields = array(  'post_author', 'post_date', 'post_date_gmt', 'post_content',
                             'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type',
                             'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping',
                             'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order',
                             'post_mime_type', 'guid', 'tax_input', 'meta_input');
      $postarr = array();
      foreach($post as $k => $v) if(in_array($k, $post_fields)) $postarr[$k] = $v;            

      $postarr['ID']            = 0;
      $postarr['post_category'] = array('casa cat');
      //not handled post_parent          

      wp_insert_post($postarr);  //not handled errors - returns false on error   
  }
}
add_action('save_post', 'mysite_clone_post', 10, 3);

Comme mentionné dans les commentaires dans le code, je n'ai géré que les nouvelles publications sans parents de publication et laissé de côté le traitement des erreurs.

Je suppose également qu’il n’ya que deux catégories et que l’on assigne simplement la catégorie opposée.

METTRE À JOUR:

Pour les types d'articles et les taxonomies personnalisés, utilisez les éléments suivants:

function mysite_clone_post($post_id, $post, $update) {
  if(!$update && $post->post_type == 'myposttype' && has_term('home cat name, id or slug', 'mytaxonomy', $post)) {  //not handled updates and will only run if it is this custom post type and in this custom category
      $post_fields = array(  'post_author', 'post_date', 'post_date_gmt', 'post_content',
                             'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type',
                             'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping',
                             'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order',
                             'post_mime_type', 'guid', 'tax_input', 'meta_input');
      $postarr = array();
      foreach($post as $k => $v) if(in_array($k, $post_fields)) $postarr[$k] = $v;            

      $postarr['ID']            = 0;          
      //not handled post_parent          

      if($newid = wp_insert_post($postarr)) {    //if saved successfully, add taxonomy, note that the value is assigned to $newid and not compared
          wp_set_object_terms($newid, 'desired cat id or slug', 'mytaxonomy');
      } else {
          //handle errors here
      }
  }
}
add_action('save_post', 'mysite_clone_post', 10, 3);

En outre, pour gérer plusieurs paires de catégories, vous pouvez utiliser un tableau, mais vous devez le mettre à jour à chaque fois que vous ajoutez une nouvelle catégorie. Je suggérerais de nommer (et d'utiliser) les limaces de manière à ce que l'une puisse être facilement dérivée de l'autre. Donc, par exemple 'main_cat' et 'main_cat_ar'.

Alors la première ligne deviendrait:

if(!$update && $post->post_type == 'myposttype') {  //not handled updates and will only run if it is this custom post type
    $terms = get_the_terms($post, 'mytaxonomy');
    if(!is_array($terms) || count(explode('_ar', $terms[0]->slug)) > 1) return;    // if no terms were returned or it belongs to an arabic category, exit

et la ligne attribuant le terme au nouveau poste devient

wp_set_object_terms($newid, $terms[0]->slug.'_ar', 'mytaxonomy');
2
inarilo