Как использовать return в моей пользовательской функции вместо echo


Я создаю функцию в functions.php с пользовательским крючком, и из того, что я где-то читал, рекомендуется возвращать вместо использования echo в функции 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 и переменной я просто повторю значения, но это все разрушит. Я неправильно использую возврат?


Обновлено с помощью решения капера - все еще не работает:

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

Я все еще делаю это неправильно?

Author: Community, 2015-01-14

3 answers

Если вы используете 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();

И кто-то может добавить свой собственный фильтр чтобы изменить вывод, если они захотят. Еще одним полезным включением может быть фильтр по аргументам, с помощью которых вы извлекаете термины, чтобы кто-то мог изменить вывод меню без необходимости воспроизводить всю функцию целиком.

Но возвращение к исходному коду, добавление do_action( 'woo_collections_menu' );, а затем повторение вывода меню непосредственно в функции также должно работать.

 1
Author: Milo, 2015-01-14 20:20:52

Из моего понимания действий (в отличие от фильтров), действие просто что-то делает и прекращает обработку. На самом деле возвращаемое значение не используется.

Вы можете изменить свой код на фильтр, приняв аргумент (скажем, 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
Author: Privateer, 2015-01-14 17:29:19

Я все еще не мог понять, как вернуть $woo_menu; с моим первым примером кода, но я понял, что ничего не сломается, если я сохраню остальную часть структуры до переменной и просто повторю один раз в самом конце. Кажется, это работает для меня. Независимо от того, является ли это хорошей практикой или нет, оставьте мне комментарий, но на данный момент это решение, которое я использую.

Спасибо.

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
Author: RachieVee, 2015-01-14 20:20:25