it-swarm-pt.tech

Como vincular 2 categorias (sincronização)

Eu quero que sempre que um usuário postar algo na categoria "Foo", o mesmo conteúdo deve ser duplicado para a categoria "Bar" automaticamente. Existe um plugin desse tipo que automatiza o processo? Ou algum PHP snippet? Eu tenho muitas categorias.

Essas categorias não são as categorias normais do WordPress, elas são personalizadas para um tema específico, como as categorias do WooCommerce, por exemplo. Então o plugin deve suportar taxonomias.

A razão é que eu tenho um site multilíngüe, usando o plugin Polylang, é o conteúdo gerado pelo usuário, na maioria das vezes o conteúdo é o mesmo em ambos os idiomas, por isso deve ser o mesmo em ambas as categorias. Quando não é o caso, só então o admin traduziria à mão.

O usuário insere conteúdo sempre na categoria de inglês, diz "Categoria residencial", ele deve ser duplicado automaticamente para a categoria "Casa" em espanhol, por exemplo.

Note que o segundo idioma é o árabe, o primeiro é o inglês, para cada categoria de inglês, há uma categoria árabe equivalente, cada postagem em inglês deve ser inserida na categoria equivalente em árabe.

1
Lynob

Coloque isso nas funções do seu tema:

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

Como mencionado nos comentários do código, apenas segurei novas postagens sem postar pais e omiti o tratamento de erros.

Eu também estou supondo que existem apenas duas categorias e simplesmente atribuindo o oposto.

ATUALIZAR:

Para tipos de postagem personalizados e taxonomias, use o seguinte:

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

Além disso, para lidar com vários pares de categorias, você poderia usar uma matriz, mas teria que atualizá-la toda vez que adicionar uma nova categoria. Eu sugiro nomear (e usar) as lesmas de tal maneira que uma pode ser facilmente derivada da outra. Então, por exemplo, 'main_cat' e 'main_cat_ar'.

Então a primeira linha se tornaria:

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

e a linha atribuindo o termo para o novo post se torna

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