web-dev-qa-db-ja.com

すべての投稿が下書きであってもカテゴリへのリンクを表示するget_terms

私は私のカスタム投稿の私のカスタム分類学のためのリンクを示すために以下のこのコードを持っています。投稿を公開しているカテゴリのみを表示するようにします。これはほとんどうまくいきますが、あるカテゴリの投稿をすべてドラフトするとリンクとして表示されますが、リンクをクリックするとアクティブなリンクがないため404ページに移動します。
公開されている投稿があり、ドラフトしかない場合やカテゴリに投稿がない場合に、カテゴリのリンクだけを表示するにはどうすればよいですか。

<?php
//list terms in a given taxonomy 
$args = array( 'hide_empty=0' );
$terms = get_terms( 'product_category', $args );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
    $count = count( $terms );
    $i = 0;
    $term_list = '<div class="product-category-list">';
    foreach ( $terms as $term ) {
        $i++;
        $term_list .= '<a class="activeunderline" href="' . esc_url( get_term_link( $term ) ) . '" alt="' . esc_attr( sprintf( __( 'View all post filed under %s', 'my_localization_domain' ), $term->name ) ) . '">' . $term->name . '</a>';
        if ( $count != $i ) {
            $term_list .= ' &middot; ';
        }
        else {
            $term_list .= '</div>';
        }
    }
    echo $term_list;
}   
?>  
3
rudtek

get_terms()はドラフト投稿を除外する組み込み機能を持っていません。なぜならそれは用語が添付されている投稿の総数だけを追跡するからです。簡単に検索してこのスニペットを見つけましたが警告されます

  • あなたのサイトのすべてのget_terms()関数に影響します( 管理領域を除外しました
  • foreachループにSQLクエリがあります - パフォーマンスに影響します
  • より多くの用語が==を返しましたより大きなパフォーマンスヒット
  • ライブWebサイトでテストすることはお勧めしません
  • トラフィックがそれほど多くない場合は、それを回避することができます。

これがおそらくそれがネイティブサポートされていない理由です - それはループ内のクエリかWordPressがドラフトと公開投稿数の両方を追跡する必要があるかのどちらかであり、どちらも完璧ではありません。

_ソース_

これは非常に厄介な解決策であり、私は自分では使いません。それはまた少し修正を必要とするかもしれません。


試してみたいのであれば、これをfunctions.phpに追加してください。


// Make sure that we're not in admin area
if( ! is_admin() ) {

    add_filter( 'get_terms', 'hide_draft_terms' );

    function hide_draft_terms( $terms, $taxonomies, $args ) {


        global $wpdb;
        $taxonomy = $taxonomies[0];

        if( ! is_array( $terms ) && count( $terms ) < 1 )
            return $terms;

        $filtered_terms = array();

        foreach ( $terms as $term ) {

            $result = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->posts p JOIN $wpdb->term_relationships rl ON p.ID = rl.object_id WHERE rl.term_taxonomy_id = $term->term_id AND p.post_status = 'publish' LIMIT 1" );

            if ( intval( $result ) > 0 ) {

                $filtered_terms[] = $term;
            }
        }

        return $filtered_terms;
    }
}
3
N00b