如何在我的定制函数中使用Return而不是ECHO

时间:2015-01-14 作者:RachieVee

我正在函数中创建一个函数。带有自定义挂钩的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; ?>
我还是做错了吗?

3 个回复
最合适的回答,由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\' ); 然后直接在功能中回显菜单输出也应起作用。

SO网友:Privateer

根据我对动作(与过滤器相反)的理解,动作只是做一些事情并停止处理。没有实际使用返回值。

您可以通过接受参数(例如要附加到的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 适合您使用。

SO网友:RachieVee

我还是不知道怎么回去$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\');

结束

相关推荐

我们能有一个没有WordPress“页面”的php“页面”吗?

在主页的某个地方,我们需要显示一个容器页面,该页面可以处理一些自定义帖子类型的内容。实际上,它做什么并不重要,我的观点是它需要存在,并且可以从主页菜单访问。我们之前已经这样做了,创建了一个WordPress“页面”作为容器页面,然后在主题/后端/PHP中创建了一个页面xxx。php是容器的所有工作发生的地方,并且。。。有点。。。作品但这确实意味着WordPress管理菜单中有一个无用的“页面”,我们必须指示客户端不要编辑它,因为“这不是一个真正的页面,只是一个占位符”,而且大多数情况下都可以。但这并不理想