วิธีการส่งผ่านตัวแปรภายนอกไปยังตัวกรอง / การกระทำ


11

ฉันพบว่าตัวเองต้องการส่งข้อมูลที่กำหนดเองไปยังตัวกรองที่จัดทำโดยปลั๊กอินของบุคคลที่สาม ทุกวิธีที่ฉันได้เห็นการทำเช่นนี้มีความซับซ้อนและยากที่จะคาดศีรษะ

ใช้ตัวอย่างนี้:

$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


เพียงแค่ "คำนวณบ้า" ของคุณภายในฟังก์ชั่นนั้น ...
onetrickpony

มันอาจจะยากที่จะเข้าใจจากตัวอย่างที่เรียบง่ายของฉัน ตัวแปร $ score ถูกใช้ตลอดเทมเพลตนั้น ฉันต้องการคำนวณเพียงครั้งเดียวและส่งผ่านค่านั้นไปยังฟังก์ชันซึ่งเป็นการเรียกกลับสำหรับตัวกรองเพื่อเปลี่ยนชื่อหน้า ตัวกรองนี้ใช้ในชุด All In One SEO ไม่ต้องการรันการคำนวณหลายครั้ง
kingkool68

จากนั้นคุณควรโพสต์รหัสเพิ่มเติมหากคุณต้องการได้รับโซลูชันที่ไม่เกี่ยวข้องกับการแนะนำสถานะโกลบอล (ซึ่งไม่จำเป็นต้องมี)
onetrickpony

นี่คือรหัสที่สมบูรณ์ในไฟล์เทมเพลต $scoreคำนวณโดยการวนซ้ำอาร์เรย์ของสิ่งต่าง ๆ และการเพิ่มตัวแปร pastebin.com/fkSXY04m
kingkool68

คำตอบ:


10

คุณมีอย่างน้อยสองตัวเลือก:

  1. ทำให้เป็นสากลตัวแปรที่ต้องการแล้วอ้างอิงภายในโทรกลับ
  2. ล้อมตรรกะการคำนวณคะแนนด้วยฟังก์ชั่นแล้วอ้างอิงภายในการโทรกลับ

โลกาภิวัตน์ตัวแปร

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


สิ่งนี้ไม่เกี่ยวข้องกับจำนวนของอาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชันโดย Apply_filters ...
onetrickpony

วิธีการพยายาม # 1 คุณพูดถึงโลกาภิวัตน์ของตัวแปร มันไม่ทำงาน args paramter ที่ยอมรับไม่ได้ช่วยฉันเช่นกันเนื่องจากฉันไม่สามารถควบคุมตัวแปรที่ส่งผ่านไปยังฟังก์ชันการเรียกกลับ
kingkool68

ขออภัยคุณพูดถูก ฉันคำนวณ$scoreก่อนแล้วจึงทำให้เป็นโลกาภิวัตน์ ไม่น่าแปลกใจที่มันไม่ทำงาน ขอขอบคุณ!
kingkool68

-1 ตัวเลือกแรก exposes ตัวแปรในรัฐทั่วโลกตัวเลือกที่ 2 ไม่ทำงาน ...
onetrickpony

1
" ลูกโลกเป็นปีศาจ " หรือไม่? จริงเหรอ ? แล้วรหัส WordPress ทั้งหมดได้ดีกว่าจะเขียนตั้งแต่มันอาศัยอยู่กับตัวแปรทั่วโลกค่อนข้างน้อย
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;
}

เรียกใช้ฟังก์ชันใดก็ได้ในสคริปต์ของคุณเพื่อรับคะแนนมันจะถูกคำนวณเพียงครั้งเดียว

อีกวิธีหนึ่งโดยใช้ฟังก์ชั่นที่ไม่ระบุชื่อ :

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

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

3
ไม่ควรใช้ฟังก์ชันที่ไม่ระบุชื่อในadd_filter()หรือadd_action()โทร remove_function()พวกเขาไม่สามารถลบได้ผ่านทาง
Chip Bennett

คุณหมายถึง remove_filter ซึ่งส่วนใหญ่จะใช้ในการลบตัวกรองในตัวไม่ใช่ตัวกรองเพิ่มโดยปลั๊กอิน / ชุดรูปแบบ ...
onetrickpony

1
ใช่; ขออภัย: และremove_filter() remove_action()และไม่มีเหตุผลที่ตัวกรองปลั๊กอิน / ชุดรูปแบบไม่ควรถูกลบอย่างมีเหตุผล: แทนที่รูปแบบแผ่นชีทของธีมปลั๊กอิน, ธีมเด็กเป็นต้น
Chip Bennett

0

ตัวอย่างต่อไปนี้เห็นตัวแปร$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');   

?>

นี่เป็นวิธีเดียวที่จะไปเกี่ยวกับมันและดูเหมือนจะเรียบร้อย สิ่งนี้จะใช้ได้สำหรับคุณหรือไม่


สิ่งนี้แตกต่างจากสิ่งที่เขามีอยู่แล้ว?
onetrickpony

เมื่อประกาศน้อยกว่าของ "ทั่วโลก" ดูตัวอย่างที่สองของเขาเขาประกาศ gloabl $ wp สองครั้ง!
อดัม

มันยังไม่ทำงาน นี่เป็นสิ่งแรกที่ฉันลอง
kingkool68

คุณสามารถprintหรือechoผลลัพธ์ของคุณเพื่อให้แน่ใจว่าฟังก์ชันของคุณใช้งานได้จริงก่อนส่งผ่านไปยังตัวกรองหรือไม่
อดัม

อ๊ะ! โลกาภิวัตน์$scoreไม่ทำงานแน่นอน ฉันโง่และเริ่ม$scoreแรกแล้วโลกาภิวัตน์ซึ่งเห็นได้ชัดว่าใช้งานไม่ได้ ทำวิธีที่เหมาะสมด้วยการทำให้โลกาภิวัตน์$scoreเป็นอันดับแรกจากนั้นให้คุณค่าทำงานตามที่คาดไว้ ขอบคุณทุกคน
kingkool68
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.