web-dev-qa-db-ja.com

エコーの代わりに私のカスタム関数でreturnを使う方法

私はカスタムフックを使ってfunctions.phpで関数を作成しています、そして私がどこかで読んだものから、 それはWordPress関数でechoを使う代わりに返すことをお勧めします ?私が間違っていたら私を直してください。

とにかく、そうエコーで、私の機能は動作しますが、他のすべてを壊します。戻ったとき、関数は何も出力していませんが、壊れたものは何もありません。私は この質問を参照として 自分の問題を解決するために/を使おうとしました。

これは私が持っているものです:

function display_collections_menu(){
/* Get WooCommerce's product categories which is custom taxonomy */
  $prod_cat_args = array(
      'taxonomy'     => 'product_cat', //woocommerce
      'orderby'      => 'name',
      'empty'        => 0
    );

    $woo_categories = get_categories( $prod_cat_args );

    $woo_menu = '';

    $woo_menu.= '<ul class="menu-collections">';

    /* For each first level category, get the image, name, and link */
    foreach ( $woo_categories as $woo_cat ) {

        if( $woo_cat->category_parent == 0 ) {
          $woo_cat_id = $woo_cat->term_id; //category ID
          $woo_img_id = get_woocommerce_term_meta( $woo_cat_id, 'thumbnail_id', true ); //category image ID
          $woo_parent_image = wp_get_attachment_url( $woo_img_id ); //category image url
          $woo_cat_slug = $woo_cat->slug; //category slug for classes
          $woo_cat_name = $woo_cat->name; //category name for link

          /* return the image/link/name */
          $orw_woo_menu.= '<li class="menu-product menu-item menu-item-object-' . $woo_cat_slug . ' ">
          <a href="' . get_term_link( $woo_cat_slug, 'product_cat' ) . '" class="menu-product-link">
          <img src="' . $woo_parent_image . '" alt=" ' . $woo_cat_name . ' " class="menu-product-thumb" />
          <p class="menu-product-name">' . $woo_cat_name . '</p></a></li>';
        } 

    }//end of $woo_categories foreach

    $woo_menu.= '</ul>';

    return $woo_menu;   
}
add_action('woo_collections_menu', 'display_collections_menu');

Returnと変数を使うのではなく、値をエコーアウトするだけでうまくいきますが、動作がおかしくなります。返品は間違っていますか?


試みPrivateerの解決策で更新された - それでも動作しない:

function display_collections_menu( $input = '' ){
/* Get WooCommerce's product categories which is custom taxonomy */
  $prod_cat_args = array(
      'taxonomy'     => 'product_cat', //woocommerce
      'orderby'      => 'name',
      'empty'        => 0
    );

    $woo_categories = get_categories( $prod_cat_args );

    $woo_menu = '';

    $woo_menu.= '<ul class="menu-collections">';

    /* For each first level category, get the image, name, and link */
    foreach ( $woo_categories as $woo_cat ) {

        if( $woo_cat->category_parent == 0 ) {
          $woo_cat_id = $woo_cat->term_id; //category ID
          $woo_img_id = get_woocommerce_term_meta( $woo_cat_id, 'thumbnail_id', true ); //category image ID
          $woo_parent_image = wp_get_attachment_url( $woo_img_id ); //category image url
          $woo_cat_slug = $woo_cat->slug; //category slug for classes
          $woo_cat_name = $woo_cat->name; //category name for link

          /* return the image/link/name */
          $orw_woo_menu.= '<li class="menu-product menu-item menu-item-object-' . $woo_cat_slug . ' ">
          <a href="' . get_term_link( $woo_cat_slug, 'product_cat' ) . '" class="menu-product-link">
          <img src="' . $woo_parent_image . '" alt=" ' . $woo_cat_name . ' " class="menu-product-thumb" />
          <p class="menu-product-name">' . $woo_cat_name . '</p></a></li>';
        } 

    }//end of $woo_categories foreach

    $woo_menu.= '</ul>';

    return $woo_menu;   
}
add_filter('collections_menu', 'display_collections_menu', 10, 1);
$html_block = apply_filters('collections_menu', $input_html);

そして、これはテンプレートです:

<?php echo $html_block; ?>

私はまだこれを間違っていますか?

1
RachieVee

テンプレートでdo_action( 'woo_collections_menu' );を使用する場合、関数はその値をエコーする必要があります。そうでなければ、あなたはデータをブラックホールにreturnしています。あなたが返すものを出力するものは何もありません。

フィルタを使用する場合は、値をreturnにする必要があります。フィルタのポイントは、値を取得し、その値を関数でフィルタ処理してから、結果を使って何かをすることです。テンプレートのコンテキストでは、apply_filtersを使用するのは少し奇妙なことになります。それは、あなたがそれを構築するまでメニューに値がないからです。そのため、テンプレートでは次のようになります。

echo apply_filters( 'collections_menu', '' );

これは混乱を招く可能性があるだけで、不要です。その空の文字列はデフォルトのメニューか何かであるかもしれませんが、それをテンプレートに入れることはおそらく最も賢い選択ではありません。

しかし、誰かが出力を変更することを可能にするために、フィルタ関数自体の中で意味をなします。

function display_collections_menu(){
    $default_menu = 'my complete menu markup here';
    return apply_filters( 'collections_menu', $default_menu );
}

それからテンプレートでは、関数を直接出力することができます。

echo display_collections_menu();

また、必要に応じて、誰かが独自のフィルタを追加して出力を変更できます。もう1つの役に立つ包含はあなたが用語を取ってくる引数のフィルタであるかもしれません、それで誰かが機能全体を再生する必要なしにメニュー出力を変えることができます。

しかし、元のコードに戻って、do_action( 'woo_collections_menu' );を追加してから、その関数内で直接メニュー出力をエコーすることでもうまくいくはずです。

1
Milo

私のアクションの理解から(フィルターとは対照的に)、アクションは単に何かをして処理を停止します。実際には戻り値は使用されません。

引数を受け付ける(追加するHTMLと言う)ことで、コードをフィルタに変更してから、コードを取得したい場所で次のように呼び出します。

$html_block = apply_filters('woo_collections_menu', $input_html);

これを行うには、関数定義を変更します。

function display_collections_menu( $input = '' ){
 #code here
}
add_filter('woo_collections_menu', 'display_collections_menu', 10, 1);

そうすれば、あなたが適当と思うように、それを使うために私たちの出力を変数$html_blockに入れるでしょう。

1
Privateer

私はまだ返す方法を見つけることができませんでした $ woo_menu; 私の最初の例のコードでは、変数の範囲内で残りの構造体を保持し、最後に1度だけエコーしても問題は発生しません。これは私にはうまくいくようです。これが良い習慣であるかどうかにかかわらず、私にコメントを残してください、しかし今のところ、これは私が使っている解決策です。

ありがとう。

function display_collections_menu(){
/* Get WooCommerce's product categories which is custom taxonomy */
  $prod_cat_args = array(
      'taxonomy'     => 'product_cat', //woocommerce
      'orderby'      => 'name',
      'empty'        => 0
    );

    $woo_categories = get_categories( $prod_cat_args );

    $woo_menu = '';

    $woo_menu.= '<ul class="menu-collections">';

    /* For each first level category, get the image, name, and link */
    foreach ( $woo_categories as $woo_cat ) {

        if( $woo_cat->category_parent == 0 ) {
          $woo_cat_id = $woo_cat->term_id; //category ID
          $woo_img_id = get_woocommerce_term_meta( $woo_cat_id, 'thumbnail_id', true ); //category image ID
          $woo_parent_image = wp_get_attachment_url( $woo_img_id ); //category image url
          $woo_cat_slug = $woo_cat->slug; //category slug for classes
          $woo_cat_name = $woo_cat->name; //category name for link

          /* return the image/link/name */
          $orw_woo_menu.= '<li class="menu-product menu-item menu-item-object-' . $woo_cat_slug . ' ">
          <a href="' . get_term_link( $woo_cat_slug, 'product_cat' ) . '" class="menu-product-link">
          <img src="' . $woo_parent_image . '" alt=" ' . $woo_cat_name . ' " class="menu-product-thumb" />
          <p class="menu-product-name">' . $woo_cat_name . '</p></a></li>';
        } 

    }//end of $woo_categories foreach

    $woo_menu.= '</ul>';

    echo $woo_menu; //ECHO at the very end instead of return works for me  
}
add_action('woo_collections_menu', 'display_collections_menu');
0
RachieVee