web-dev-qa-db-ja.com

カスタム分類用語が投稿を公開したかどうかを確認しますか?

私はクライアントのために雑誌のテーマを作り、カスタムの「issue」分類法を使用しています。毎週新しい号があり、私はまた最新号を取得する機能を持っています。しかし、編集者はその号の記事が公開される数日前に新しい号を作成します。私の現在の関数は、最大番号のissueを見つけるためにmax()を使用しています。

function get_issues() {
    $output = array();
    $hlterms = get_terms('issue', array('hide_empty' => false));
    foreach($hlterms as $term){
         array_Push($output, $term->name);
    } 
    return $output;
}
function get_current_issue() {
    $current_issue_no = max(get_issues());
    $current_issue = get_issue_by_number($current_issue_no); // Not important for question
    return $current_issue;
}

'issue'のすべての用語は、101,402などのような(文字列としての)数値です。IIssueオブジェクトを返すために最も大きい番号を使用しますが、ここではそれほど重要ではありません。すでに機能しているインスタンス生成関数get_issue_by_number()へ。

それでは、返された「issue」に投稿が掲載されているかどうかを確認する方法はありますか。考えは、get_current_issue()関数は出版社によって活発であると考えられる最新の問題だけを返すということです。彼らは事前に記事を作成し、アップロードしてから数日後に公開日を付けます。 102がアクティブな投稿に割り当てられていないため、102が存在していても101号を返すような関数を書くことができれば理想的です。しかし、その後投稿が設定日にアクティブになると、関数は102を返し始めます。誰もがこれを行うためのより良い方法があれば私のアプローチを変更して喜んで、すべての考えは大歓迎です。

だから、私が達成したいと思うものの簡単な例:

私は2つの「issue」、123と124を持っています。私はしばらく前に123を作成し、それ以来公開された投稿を割り当てました。しかし、私は最近124を作成したばかりで、まだ公開された投稿は添付されていません。 124は技術的にはもっと新しいものですが、私の関数はissue 123 not 124を返すべきです。 124号には割り当てられていないのに対し、123号には多数の公開された投稿が割り当てられているという事実がこの結果を決定します。その後、issue 124に割り当てられた投稿を公開すると、それが現在のissueになります。

2
ian
function get_issues() {
 $output = array();
 $hlterms = get_terms('issue', array('orderby' => 'id', 'order' => 'DESC','hide_empty' => false));
 foreach($hlterms as $term){
     array_Push($output, $term->term_id);
 } 
 return $output;
}

これにより、最近のIDと同じように用語idが返され、次に2番目の関数で最新号の投稿を取得するための反復が開始されます。

function get_posts_for_current_issue() {
   $total_issues = get_issues();
   foreach($total_issues as $issue_id){
     $args = array(
     'post_type' => 'post',
         'status' => 'publish',
     'tax_query' => array(
          array(
        'taxonomy' => 'issue',
        'field' => 'id',
        'terms' => $issue_id
          )
           )
        );//end of args
     $current_issue_posts = get_posts($args);
     if(!is_wp_error($current_issue_posts) && count($current_issue_posts)>0){
        return $current_issue_posts; //will terminate the loop if posts found
     }
   }//end of foreach
 }//end of function

コードをテストできないため、WP_DEBUGをオンにする必要があるかもしれません。

1
sven

'field'=>'term_id'の代わりに'field'=>'id'を使うことをお勧めします。 wordpress codex page get_terms()に関してはそれは正しい方法でしょうし、それはテスト中の私の問題でした。

私のコード例(termが投稿を公開しているかどうかを確認する):

function check_term_posts($tax_slug, $term_id) {
    $args = array(
        'post_type' => 'post',
        'status' => 'publish',
        'tax_query' => array(
            array(
                'taxonomy' => $tax_slug,
                'field' => 'term_id',
                'terms' => $term_id
            )
        )
    );
    $term_query =  new WP_Query($args);
    $term_posts_count = $term_query->found_posts;
    if( $term_posts_count>0 ){
        return true;
    } else {
        return false;
    }
}
2
stefan-mewa
if (get_term($term->term_id, 'taxonomy')->count > 0 ) {

}
0
Flector