So übergeben Sie externe Variablen an Filter / Aktionen

Ich finde, dass ich benutzerdefinierte Daten an einen Filter übergeben muss, der von einem Drittanbieter-Plugin bereitgestellt wird. All die Möglichkeiten, die ich gesehen habe, sind wirklich kompliziert und schwer zu verstehen.

Nimm dieses Beispiel:

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

Wie kann ich die Variable $score an add_score_to_title() ?

Am Ende habe ich meine Variable in das globale $wp Objekt $wp . Damit hast du am Ende folgendes:

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

Dreckig? Könnte sein. Einfach? Jep! Irgendwelche Nachteile dieser Technik? Bitte diskutiere.

UPDATE Hier ist der komplette Code in Frage -> http://pastebin.com/fkSXY04m

Solutions Collecting From Web of "So übergeben Sie externe Variablen an Filter / Aktionen"

Sie haben mindestens zwei Möglichkeiten:

  1. Globalisieren Sie die gewünschte Variable und referenzieren Sie sie anschließend im Callback
  2. Wickeln Sie die Score-Berechnungslogik mit einer function um und referenzieren Sie sie anschließend im Callback

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

Wickeln Sie die Score-Berechnung um

Wenn Sie die Score-Berechnung nur innerhalb des Filters benötigen, ziehen Sie die Logik in den Callback selbst:

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

Besser noch, Sie können Ihre Score-Berechnung in eine eigene function einbinden und dann diese function in Ihrem Callback aufrufen:

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

Wenn Sie Probleme beim Verweisen auf das $_POST Objekt $_POST , können Sie auch Ihre get_query_var() registrieren und intern dann get_query_var() , um Daten 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'] dies vorhanden ist, kann $_POST['Q'] durch 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; } 

Rufen Sie die function an einer beliebigen Stelle in Ihrem Skript auf, um die Punktzahl zu erhalten. Sie wird nur einmal berechnet.

Eine andere Möglichkeit, anonyme functionen zu verwenden :

 // do the calc $score = 'xxx'; add_filter('aioseop_title_single', function($title) use($score){ return 'Quiz Results (' . $score . ') - ' . $title; }); 

Im folgenden Beispiel wird die Variable $my_calculation im globalen Bereich $my_calculation , jedoch müssen wir innerhalb unserer lokalen function global $my_calculation deklarieren, um auf die Variable im globalen Gültigkeitsbereich zugreifen zu können.

 < ?php $my_calculation = 'result!'; function my_function() { global $my_calculation; return $my_calculation; } add_filter( 'function_something_here', 'my_function'); ?> 

Dies ist nur ein Weg, um es zu tun, und es scheint ordentlich zu sein. Würde das für dich funktionieren?