如何将外部变量传递给筛选器/操作

时间:2012-04-11 作者:kingkool68

我发现自己需要将自定义数据传递给第三方插件提供的过滤器。我看到的所有方法都非常复杂,很难让我理解。

举个例子:

$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

3 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

您至少有两种选择:

将所需变量全球化,然后在回调中引用该变量,用函数包装分数计算逻辑,然后在回调中引用该变量

<?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\').

SO网友:onetrickpony

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;  
});

SO网友:Adam

下面的示例查看变量$my_calculation 但是,在全局范围内,我们需要在本地函数中声明global $my_calculation 以访问全局范围内的变量。

<?php 

    $my_calculation = \'result!\';

    function my_function() {

        global $my_calculation;
        return $my_calculation;

    }

    add_filter( \'function_something_here\', \'my_function\');   

?>
这只是一种方法,看起来很整洁。这对你有用吗?

结束

相关推荐

Passing variables to new page

我试图将变量传递到新页面,我在主题中创建了一个函数来获得结果。现在当我使用yelplist(); 在我的主题首页上,它会得到结果,当我点击链接时,它会按要求将图像和城市返回给我。Questions:<然而,我想知道我能做些什么让变量传递到自己的页面。例如:如果我单击该名称,一个新页面将显示该链接的图像和城市结果</也可以在单曲中完成。php文件,还是将是一个全新的页面/文件Update 1*我在使用$\\u会话方面取得了一些进展,现在我可以将变量传递到单个会话中。然而,当我点击这个链接时,它