Cómo pasar variables externas a filtros / acciones

9

Necesito pasar datos personalizados a un filtro proporcionado por un complemento de terceros. Todas las formas que he visto para hacer esto son realmente complicadas y difíciles de entender.

Toma este ejemplo:

$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');

¿Cómo puedo pasar la variable $score a add_score_to_title() ?

Lo que terminé haciendo fue agregar mi variable al objeto global $wp . Así que terminas con esto:

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

¿Sucio? Tal vez. ¿Sencillo? ¡Sip! ¿Alguna desventaja de esta técnica? Por favor discutelo.

ACTUALIZACIÓN Aquí está el código completo en cuestión - > enlace

    
pregunta kingkool68 11.04.2012 - 21:37

3 respuestas

9

Tienes al menos dos opciones:

  1. Globalice la variable deseada y luego haga referencia a ella dentro de la devolución de llamada
  2. Envuelva la lógica de cálculo de puntuación con una función, luego haga referencia a ella dentro de la devolución de llamada

Globalice la variable

<?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');
?>

Ajustar el cálculo de puntuación

Si solo necesitas el cálculo de puntuación dentro de el filtro, coloca la lógica en la devolución de llamada:

<?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');
?>

Mejor aún, podría ajustar su cálculo de puntuación en una función propia y luego llamar a esa función dentro de su devolución de llamada:

<?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');
?>

Si encuentra problemas para hacer referencia al objeto $_POST , también puede registrar su variable de consulta y luego usar get_query_var() internamente para obtener datos:

function add_score_query_vars( $query_vars ) {
    $query_vars[] = 'Q';

    return $query_vars;
}
add_filter( 'query_vars', 'add_score_query_vars' );

Con esto en su lugar, $_POST['Q'] se puede reemplazar con get_query_var('Q') .

    
respondido por el Chip Bennett 11.04.2012 - 21:44
3
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;
}

Llame a la función en cualquier parte de su script para obtener la puntuación, solo se calculará una vez.

Otra forma, utilizando funciones anónimas :

// do the calc
$score = 'xxx';

add_filter('aioseop_title_single', function($title) use($score){
  return 'Quiz Results (' . $score . ') - ' . $title;  
});
    
respondido por el onetrickpony 11.04.2012 - 22:02
0

El siguiente ejemplo ve la variable $my_calculation en el alcance global, sin embargo, dentro de nuestra función local necesitamos declarar global $my_calculation para acceder a la variable en el alcance global.

<?php 

    $my_calculation = 'result!';

    function my_function() {

        global $my_calculation;
        return $my_calculation;

    }

    add_filter( 'function_something_here', 'my_function');   

?>

Esto es solo una forma de hacerlo y parece estar limpio. ¿Esto funcionaría para ti?

    
respondido por el userabuser 11.04.2012 - 21:57

Lea otras preguntas en las etiquetas