我有一个功能,我需要使用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;
答案 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;