我正在函数中创建一个函数。带有自定义挂钩的php,根据我在某处读到的内容,it\'s good practice to return instead of use echo in a WordPress function? 如果我错了,请纠正我。
总之,对于echo,我的函数可以工作,但会破坏其他所有功能。使用return,函数不再输出任何内容,但没有任何内容被破坏。我试着用this question as a reference 来修理我的。
以下是我所拥有的:
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和变量,而只是回显值,那么它会起作用,但它会破坏一些东西。我使用return错误吗?
<小时>
Updated with an attempt Privateer\'s solution - still doesn\'t work:
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; ?>
我还是做错了吗?
最合适的回答,由SO网友:Milo 整理而成
如果您使用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\' );
然后直接在功能中回显菜单输出也应起作用。