在do_action函数上使用输出缓冲区有什么缺点吗?

时间:2017-11-13 00:00:54

标签: php wordpress

我有一个功能,我需要使用apply_filter和两个之间的动作。使用这种方法有什么缺点吗?还有其他选择吗?

$form = array ('choice1', 'choice2', 'choice3') 
$content= "";
foreach ($form as $choice ) {

    ob_start();
    do_action( 'before_choice', $form_id, $choice );
    $content .= ob_get_clean(); 

    $content .='<div class="choice-container">'. $choice .'</div>';

    ob_start();
    do_action( 'after_choice', $form_id, $choice );
    $content .= ob_get_clean();                     

}
$content = apply_filters( 'change_choices_layout', $content, $form  );
echo $content;

2 个答案:

答案 0 :(得分:0)

如果它是静态内容,我的替代方案是使用在屏幕上呈现更快的瞬变。 ob_start()的问题在于,如果您或其他人修改了此操作,则可以使用#before; before_choice&#39;并且在其中再次调用ob_start(),然后在内容消失时,很难对正在进行的操作进行故障排除。我还会将您的do_action更改为apply_filters,然后重写您之前的选择权&#39;钩子是add_filter而不是add_action钩子,因为默认情况下过滤器会返回一个值,因此您不再需要使用ob_start()。

答案 1 :(得分:0)

我发现更好的解决方案就是像这样使用它:

$form = array ('choice1', 'choice2', 'choice3') 
$content= "";
foreach ($form as $choice ) {

    if ( has_filter( 'wwob_after_product_item_price') ){
        $content .= apply_filters( 'wwob_after_product_item_price', $form_id, $choice );    
    }           

    $content .='<div class="choice-container">'. $choice .'</div>';

    if ( has_filter( 'after_choice') ){
        $content .= apply_filters( 'after_choice', $form_id, $choice ); 
    }                 

}
$content = apply_filters( 'change_choices_layout', $content, $form  );
echo $content;