web-dev-qa-db-ja.com

ワードプレスのカスタムタグをコンマで区切って出力するにはどうすればいいですか?

いくつかの参照に基づいて、私はカンマで区切られたカスタム分類法の用語のリストを出力するための関数を構築しました。 food_tagは私がカスタムのpost_typeに登録したカスタム分類法です。

これが関数です:

function get_taxonomy_food_tags(){
 $terms = get_terms('food_tag');
 foreach($terms as $term){

 // The $term is an object, so we don't need to specify the $taxonomy.

 $term_link = get_term_link($term);

 $numItems = count($terms);
 $i        = 0;

 // If there was an error, continue to the next term.

 if (is_wp_error($term_link)){
      continue;
 }

 // We successfully got a link. Print it out.

 echo '<a href="' . esc_url($term_link) . '">' . $term->name . '</a>';

 if (++$i != $numItems) {
            echo ', ';
 }

 }
}

それから私はテーマの.phpテンプレートのどこかにコード<?php get_taxonony_food_tags(); ?>を置き、そして私のカスタムタグのリストをリンク付きで得ます。といった:

材料:ベーコン、トマトスライス、トマトソース、レタス、牛肉、

配列の最後のタグもカンマで印刷されています。

最後のカンマを除外するように関数を正しく設定するにはどうすればいいですか?

前もって感謝します。

1

ここにいくつかの欠陥があります。

  • 常にあなたのコードなるという考え方を持った方法でコードを書く) 失敗します。これはとても重要です。ほとんどの人は完璧な世界の考え方でコード化しています。完璧な世界は決して起こりません。コードが失敗したときに何が起こるかを常に考えてください。

    例として、あなたのコードでは、すべてがうまくいかなければ$termsはtermオブジェクトのオブジェクトを返します。分類法に用語がない場合、または投稿がない用語がない場合も、$termsは空の配列を返します。分類法が存在しない場合はWP_Errorオブジェクトも返します。これはすべてのバグです。無効な分類法があります。分類をプラグインに正しく登録し、そのプラグインを無効にすると、分類が存在しなくなり、無効な分類エラーが発生します。

  • あなたはあなたのforeachループの外側であなたのカウンターを始めるべきです。中ではない

  • get_接頭辞は、エコーを返さずに、その出力を返す関数に使用されます。

  • 常にサニタイズして検証する

私はこのように見えるようにあなたのコードを書き直す:(注:PHP5.4 +が必要です

function get_taxonomy_food_tags( $taxonomy = '', $args = [] )
{
    // Check if we have a taxonomy and that it is valid. If not, return false
    if ( !$taxonomy )
        return false;

    // Sanitize the taxonomy input
    $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING );

    if ( !taxonomy_exists( $taxonomy ) )
        return false;

    // If we reached this point, our taxonomy is valid. So lets continue. Get our terms
    $terms = get_terms( $taxonomy, $args );

    // We will only check if we have terms, we know our taxonomy is valid because we have reached this point
    if ( empty( $terms ) )
        return false;

    // Great, if we got to this point, we have terms, lets continue
    // Define our variable to hold our term links
    $term_links_array = [];
    foreach ( $terms as $term ) {
        $term_link = get_term_link( $term );

        // Make sure we do not have a WP_Error object, not really necessary, but better be safe
        if ( is_wp_error( $term ) )
            continue;

        // Build an array of term links. Let php do the hard work and calculations
        $term_links_array[] = '<a href="' . esc_url($term_link) . '">' . $term->name . '</a>';
    } // endforeach

    // Make sure that we have an array of term links, if not, return false
    if ( !$term_links_array )
        return false;

    // We have reached this point, lets output our term links
    return implode( ', ', $term_links_array );
}

あなたは今、以下のようにそれを使うことができます

echo get_taxonomy_food_tags( 'food_tag' );

内部のget_terms()関数に引数の配列を渡すために使用できる2番目のパラメータも紹介しました。そのため、デフォルトのget_terms()関数とまったく同じ方法で新しい関数を使用できます

2
Pieter Goosen

問題は、foreachループが実行されるたびに$ iに値として0を指定しているため、最後のifステートメントが実行されると、比較が1!= 3になるたびに、コンマが常に出力されることです。 $ i = 0を宣言してください。 foreachループの外側このような:

$terms = get_terms('food_tag');
$i = 0;
foreach($terms as $term){ 

//the code here

}

また、最後に欠けている波括弧があるかもしれません、多分それはただコピーペーストエラーですが、これをコピーペーストしてそれを実行しようとする人々のために。