问题描述
我发现自己需要将自定义数据传递给第三方插件提供的过滤器。我所看到的所有这些方法真的很复杂,很难包围我的头脑。
举个例子:
$score = 42; //Some crazy calculation I don't want to repeat.
function add_score_to_title($title) {
return 'Quiz Results (' . $score . '/') - ' . $title;
}
add_filter( 'aioseop_title_single', 'add_score_to_title');
如何将 $score
变量传递给 add_score_to_title()
?
我最后做的是将我的变量添加到全局 $wp
对象。所以你最终得到这个:
global $wp;
$score = 42; //Some crazy calculation I don't want to repeat.
$wp->some_random_name_for_score = $score;
function add_score_to_title($title) {
global $wp;
$score = $wp->some_random_name_for_score;
return 'Quiz Results (' . $score . '/') - ' . $title;
}
add_filter( 'aioseop_title_single', 'add_score_to_title');
脏?也许。简单?对!这种技术有哪些缺点?请讨论。
UPDATE 这是完整的代码 – > http://pastebin.com/fkSXY04m
最佳解决方案
您至少有两个选择:
-
全局化所需的变量,然后在回调中引用它
-
使用函数包括分数计算逻辑,然后在回调中引用它
全局化变量
<?php
global $score;
$score = 42; //Some crazy calculation I don't want to repeat.
function add_score_to_title($title) {
global $score;
return 'Quiz Results (' . $score . '/') - ' . $title;
}
add_filter( 'aioseop_title_single', 'add_score_to_title');
?>
包裹分数计算
如果您只需要过滤器中的分数计算,将逻辑拉入回调本身:
<?php
function add_score_to_title($title) {
$score = 0;
$questions = get_quiz_result_questions();
$total_questions = 0;
foreach( $questions as $question ) {
$order = $question->order;
if( $order >= 100 ) {
break;
}
if( $question->correct == $_POST['Q'][$order] ) {
$score++;
}
$total_questions++;
return 'Quiz Results (' . $score . '/') - ' . $title;
}
add_filter( 'aioseop_title_single', 'add_score_to_title');
?>
更好的是,您可以将自己的分数计算包含在自己的函数中,然后在回调函数内调用该函数:
<?php
function wpse48677_get_score() {
$score = 0;
$questions = get_quiz_result_questions();
$total_questions = 0;
foreach( $questions as $question ) {
$order = $question->order;
if( $order >= 100 ) {
break;
}
if( $question->correct == $_POST['Q'][$order] ) {
$score++;
}
$total_questions++;
$output['score'] = $score;
$output['total_questions'] = $total_questions;
return $output;
}
function add_score_to_title($title) {
$score_results = wpse48677_get_score();
$score = $score_results['score'];
return 'Quiz Results (' . $score . '/') - ' . $title;
}
add_filter( 'aioseop_title_single', 'add_score_to_title');
?>
如果您发现有引用 $_POST
对象的问题,您还可以注册查询变量,然后在内部使用 get_query_var()
来获取数据:
function add_score_query_vars( $query_vars ) {
$query_vars[] = 'Q';
return $query_vars;
}
add_filter( 'query_vars', 'add_score_query_vars' );
有了这个,$_POST['Q']
可以用 get_query_var('Q')
代替。
次佳解决方案
function add_score_to_title($title = false) {
static $score = false;
if($score === false){
// do calc
}
// plugin call (filter)
if($title !== false)
return 'Quiz Results (' . $score . ') - ' . $title;
// your call
return $score;
}
在您的脚本中的任何地方调用函数以获得分数,它只会计算一次。
另一种方法,使用 anonymous functions:
// do the calc
$score = 'xxx';
add_filter('aioseop_title_single', function($title) use($score){
return 'Quiz Results (' . $score . ') - ' . $title;
});
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。