Как использовать 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; ?>
Я все еще делаю это неправильно?
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' );
, а затем повторение вывода меню непосредственно в функции также должно работать.
Из моего понимания действий (в отличие от фильтров), действие просто что-то делает и прекращает обработку. На самом деле возвращаемое значение не используется.
Вы можете изменить свой код на фильтр, приняв аргумент (скажем, 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
для использования как вы считаете нужным.
Я все еще не мог понять, как вернуть $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');