如何链接两个类别(同步)

时间:2017-06-03 作者:Lynob

我希望每当用户在类别“Foo”中发布内容时,相同的内容必须自动复制到类别“Bar”。有没有这样一个插件可以自动完成这个过程?还是一些PHP代码片段?我有很多类别。

这些类别不是普通的WordPress类别,它们是特定主题的自定义类别,例如WooCommerce类别。因此插件必须支持分类法。

原因是我有一个多语言网站,使用Polylang插件,它是用户生成的内容,大多数情况下,两种语言的内容是相同的,所以两个类别的内容必须相同。如果不是这样,只有这样管理员才会手工翻译。

用户总是在英语类别中插入内容,例如“Home category”,它必须自动复制到西班牙语的“Casa”类别。

请注意,第二种语言是阿拉伯语,第一种是英语,对于每个英语类别,都有一个等效的阿拉伯语类别,每个英语帖子都必须插入等效的阿拉伯语类别。

1 个回复
最合适的回答,由SO网友:inarilo 整理而成

将其放置在主题功能中:

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);
正如代码中的注释所述,我只处理了没有帖子父级的新帖子,而忽略了错误处理。

我还假设只有两个类别,并简单地分配一个相反的类别。

更新时间:

对于自定义帖子类型和分类,请使用以下内容:

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);
此外,要处理多个类别对,可以使用一个数组,但每次添加新类别时都必须对其进行更新。我建议以这样一种方式命名(和使用)鼻涕虫,即一种鼻涕虫可以很容易地从另一种鼻涕虫派生出来。例如,“main\\u cat”和“main\\u cat\\u ar”。

那么第一行将变成:

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
将术语分配给新职位的行变为

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

结束

相关推荐

Categories' hierarchy in URL

我目前正在处理的网站中的帖子都有多个层次分类。例如:Source - Books -- Moby Dick -- Sherlock Holmes 永久链接设置为/%category%/%postname%/. 然而,一篇文章的URL并不包括所有的子类别——我得到的只是site.com/source/books/*postname*, 尽管这篇文章在来源上没有分类,但只在书籍+白鲸上。有人能帮我找出如何调整这种行为吗?非常感谢。

如何链接两个类别(同步) - 小码农CODE - 行之有效找到问题解决它

如何链接两个类别(同步)

时间:2017-06-03 作者:Lynob

我希望每当用户在类别“Foo”中发布内容时,相同的内容必须自动复制到类别“Bar”。有没有这样一个插件可以自动完成这个过程?还是一些PHP代码片段?我有很多类别。

这些类别不是普通的WordPress类别,它们是特定主题的自定义类别,例如WooCommerce类别。因此插件必须支持分类法。

原因是我有一个多语言网站,使用Polylang插件,它是用户生成的内容,大多数情况下,两种语言的内容是相同的,所以两个类别的内容必须相同。如果不是这样,只有这样管理员才会手工翻译。

用户总是在英语类别中插入内容,例如“Home category”,它必须自动复制到西班牙语的“Casa”类别。

请注意,第二种语言是阿拉伯语,第一种是英语,对于每个英语类别,都有一个等效的阿拉伯语类别,每个英语帖子都必须插入等效的阿拉伯语类别。

1 个回复
最合适的回答,由SO网友:inarilo 整理而成

将其放置在主题功能中:

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);
正如代码中的注释所述,我只处理了没有帖子父级的新帖子,而忽略了错误处理。

我还假设只有两个类别,并简单地分配一个相反的类别。

更新时间:

对于自定义帖子类型和分类,请使用以下内容:

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);
此外,要处理多个类别对,可以使用一个数组,但每次添加新类别时都必须对其进行更新。我建议以这样一种方式命名(和使用)鼻涕虫,即一种鼻涕虫可以很容易地从另一种鼻涕虫派生出来。例如,“main\\u cat”和“main\\u cat\\u ar”。

那么第一行将变成:

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
将术语分配给新职位的行变为

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