web-dev-qa-db-ja.com

2つのカテゴリをリンクする方法(同期)

ユーザーがカテゴリ "Foo"に何か投稿したときはいつでも、同じコンテンツをカテゴリ "Bar"に自動的に複製する必要があります。プロセスを自動化するようなプラグインはありますか?それともPHPスニペットですか。私はたくさんのカテゴリーがあります。

これらのカテゴリは通常のWordPressのカテゴリではなく、WooCommerceのカテゴリのように、特定のテーマではカスタムです。そのため、プラグインは分類法をサポートする必要があります。

その理由は、私がPolylangプラグインを使用している多言語ウェブサイトを持っているということです、それはユーザー生成コンテンツです、ほとんどの場合、コンテンツは両方の言語で同じであるので両方のカテゴリーで同じでなければなりません。そうでない場合は、管理者のみが手動で翻訳します。

ユーザーは常に「ホームカテゴリ」という英語のカテゴリにコンテンツを挿入します。たとえば、スペイン語の場合は「Casa」カテゴリに自動的に複製される必要があります。

2つ目の言語はアラビア語、1つ目は英語です。すべての英語のカテゴリについて、同等のアラビア語カテゴリがあり、すべての英語の投稿は同等のアラビア語カテゴリに挿入する必要があります。

1
Lynob

あなたのテーマ関数にこれを置きなさい:

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

コードのコメントで述べたように、私はポストの親なしで新しいポストを扱うだけで、エラー処理を省きました。

私はまた2つのカテゴリーしかないと仮定して、単に反対のものを割り当てています。

更新:

カスタム投稿タイプと分類法の場合は、以下を使用します。

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_cat'と 'main_cat_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');
2
inarilo