Dış Değişkenleri Filtrelere / Eylemlere Aktarma


11

Kendimi, üçüncü taraf bir eklenti tarafından sağlanan bir filtreye özel veriler geçirmeye ihtiyaç duyduğumu fark ettim. Bunu yapmak için gördüğüm tüm yollar gerçekten karmaşık ve kafamı sarmak zor.

Bu örneği ele alalım:

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

$scoreDeğişkeni nasıl iletebilirim add_score_to_title()?

Sonunda yaptığım şey değişkenimi global $wpnesneye eklemekti . Böylece bununla sonuçlanırsınız:

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

Kirli? Olabilir. Basit? Evet! Bu tekniğin bir dezavantajı var mı? Lütfen tartışın.

GÜNCELLEME İşte söz konusu kodun tamamı -> http://pastebin.com/fkSXY04m


Basitçe bu işlev içinde "çılgın hesaplama" yapmak ...
onetrickpony

Basitleştirilmiş örneğimden anlamak muhtemelen zor. Bu şablon boyunca $ skor değişkeni kullanılır. Bir kez hesaplamak ve bu değeri sayfa başlığını değiştirmek için bir filtre için bir geri çağrı olan işleve geçmek istiyorum. Bu filtre All In One SEO Paketinde kullanılır. Hesaplamanın birden çok kez yapılması istenmez.
kingkool68

Daha sonra, küresel durumu tanıtmayı içermeyen bir çözüm elde etmek istiyorsanız daha fazla kod göndermelisiniz (asla gerekli olmamalıdır).
onetrickpony

İşte bir şablon dosyasındaki kodun tamamı. $scorebir şey dizisi üzerinde döngü yaparak ve bir değişkeni artırarak hesaplanır. pastebin.com/fkSXY04m
kingkool68

Yanıtlar:


10

En az iki seçeneğiniz var:

  1. İstenen değişkeni genelleştirin ve sonra geri arama içinde referans alın
  2. Puan hesaplama mantığını bir işlevle sarın, sonra geri arama içinde referans alın

Değişkeni Globalleştirin

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

Puan Hesaplamasını Sarın

Yalnızca filtrenin içindeki skor hesaplamasına ihtiyacınız varsa , mantığı geri aramanın içine çekin:

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

Daha da iyisi, puan hesaplamanızı kendi fonksiyonuna sarabilir ve ardından bu fonksiyonu geri aramalarınızda çağırabilirsiniz:

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

$_POSTNesneye başvururken sorun yaşarsanız, sorgu değişkeninizi kaydedebilir ve daha sonra get_query_var()veri almak için dahili olarak kullanabilirsiniz :

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

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

Bu yerdeyken, $_POST['Q']ile değiştirilebilir get_query_var('Q').


Bunun, function_filters tarafından işleve iletilen argümanların sayısı ile ilgisi yoktur ...
onetrickpony

Değişkenin küreselleştirilmesinden bahsettiğiniz 1 numaralı yöntem denendi. Çalışmıyor. Geri çağırma işlevine hangi değişkenlerin aktarıldığı üzerinde hiçbir denetime sahip olmadığım için kabul edilen args parametresi bana yardımcı olmaz.
kingkool68

Üzgünüm haklıydın. $scoreÖnce hesapladım ve sonra küreselleştirdim. İşe yaramadığına şaşmamalı. Teşekkür ederim!
kingkool68

-1. İlk seçenek küresel durumda bir değişkeni ortaya çıkarır, 2. seçenek çalışmaz ...
onetrickpony

1
" Globaller kötülük " mü? Gerçekten mi? Daha sonra, WordPress kodunun tamamı yazılmalıydı, çünkü birkaç küresel değişkene dayanıyor .
Chip Bennett

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

Skoru elde etmek için kodunuzdaki herhangi bir yere fonksiyon çağırın, sadece bir kez hesaplanacaktır.

Anonim işlevleri kullanarak başka bir yol :

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

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

3
Anonim işlevler de kullanılmamalıdır add_filter()veya add_action()aramaları. Aracılığıyla kaldırılamazlar remove_function().
Chip Bennett

Yani ağırlıklı olarak eklenti / tema tarafından eklenen filtreleri değil, yerleşik filtreleri kaldırmak için kullanılan
remove_filter

1
Evet; üzgünüm: remove_filter()ve remove_action(). Ve kaldırılacak Eklenti / Tema filtreleri makul mümkün olmaması gerektiğini sebep yok: stil enqueues, Çocuk Temalar vb Eklenti geçersiz kılma
Chip Bennett

0

Aşağıdaki örnek, değişkeni $my_calculationgenel kapsamda görür , ancak yerel işlevimizden global $my_calculation, değişkene genel kapsamda erişmek için bildirmemiz gerekir .

<?php 

    $my_calculation = 'result!';

    function my_function() {

        global $my_calculation;
        return $my_calculation;

    }

    add_filter( 'function_something_here', 'my_function');   

?>

Bu, bununla ilgili bir yol ve düzgün görünüyor. Bu senin için işe yarar mı?


Bu zaten sahip olduğundan nasıl farklı?
onetrickpony

Bir kez daha "küresel" beyanı. İkinci örneğine bakın, iki kez gloabl $ wp ilan etti!
Adam

Ayrıca işe yaramıyor. Denediğim ilk şey bu.
kingkool68

Filtreye geçirmeden önce işlevinizin gerçekten çalıştığından emin olabilir misiniz printveya echosonucunuz mu var?
Adam

Hata! Küreselleşme $scoregerçekten işe yarıyor. Ben önce gittim ve $scoresonra küreselleşti, ki bu açıkça işe yaramıyor. $scoreÖnce küreselleşip sonra bir değer vererek bunu doğru şekilde yapmak beklendiği gibi çalışır. Herkese teşekkürler.
kingkool68
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.