it-swarm.com.de

So übergeben Sie externe Variablen an Filter/Aktionen

Ich muss benutzerdefinierte Daten an einen Filter übergeben, der von einem Plugin eines Drittanbieters bereitgestellt wird. Alle Wege, die ich gesehen habe, um dies zu tun, sind wirklich kompliziert und schwer, meinen Kopf herumzuwickeln.

Nehmen Sie 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() übergeben?

Am Ende habe ich meine Variable zum globalen Objekt $wp hinzugefügt. Am Ende haben Sie 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');

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

UPDATEHier ist der vollständige fragliche Code -> http://Pastebin.com/fkSXY04m

11
kingkool68

Sie haben mindestens zwei Möglichkeiten:

  1. Globalisieren Sie die gewünschte Variable und referenzieren Sie sie anschließend im Callback
  2. Binden Sie die Berechnungslogik für die Punktzahl in eine Funktion ein und verweisen Sie dann innerhalb des Rückrufs darauf

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

Wenn Sie nur die Score-Berechnung 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 Punktzahlberechnung in eine eigene Funktion einbinden und diese Funktion dann in Ihrem Rückruf 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 haben, können Sie auch Ihre Abfragevariable registrieren und dann get_query_var() intern verwenden, um Daten abzurufen:

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

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

Wenn dies aktiviert ist, kann $_POST['Q'] durch get_query_var('Q') ersetzt werden.

10
Chip Bennett
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 Funktion an einer beliebigen Stelle in Ihrem Skript auf, um die Punktzahl zu erhalten. Sie wird nur einmal berechnet.

Ein anderer Weg, mit anonymen Funktionen :

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

add_filter('aioseop_title_single', function($title) use($score){
  return 'Quiz Results (' . $score . ') - ' . $title;  
});
3
onetrickpony

Im folgenden Beispiel wird die Variable $my_calculation im globalen Bereich angezeigt. In unserer lokalen Funktion müssen Sie jedoch global $my_calculation deklarieren, um auf die Variable im globalen Bereich 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 eine Möglichkeit, und es scheint ordentlich zu sein. Würde das für dich funktionieren?

0
userabuser