2017-11-13 5 views
0

私は、apply_filterとその間にいくつかのアクションを使用する必要がある機能を持っています。このアプローチを使用する場合の欠点はありますか?代わりがありますか?do_action関数で出力バッファを使用する場合の欠点はありますか?

$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

。 – Shibi

+0

do_actionの結果を正確な位置に出力する必要があります。私の場合はこれが動作するかどうかはわかりません。 –

+0

このような最後のコンテンツの値を割り当てることができますhttps://eval.in/898384 – Shibi

答えて

0

静的なコンテンツの場合は、代わりに画面上でレンダリングする方がはるかに高速なトランジェントを使用することもできます。 ob_start()の問題は、あなたや他の人が 'before_choice'アクションを修正し、その中にob_start()をもう一度呼び出すと、コンテンツが消えてしまうことをトラブルシューティングするのが難しくなることです。 do_actionapply_filtersに変更し、 'before_choice'フックをadd_actionフックの代わりにadd_filterに書き換えます。フィルタはデフォルトで値を返すので、ob_start()をもう使用する必要はありません。

+0

私はapply_filterを試しましたが、この問題を使用すると、 'apply_filter( 'after_choice'、$ form_id、$ $ somevalue'は40という値を持っています。最後にecho $ contentを使用していたので、この位置では常に40を返します。 –

+0

フィルタ定義が含まれていないため、あなたの言っていることについてコメントすることはできません。 –

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; 
関連する問題