วิธีการ do_action และรับค่าตอบแทน?


10

ดังนั้นจึงมีสถานการณ์ดังต่อไปนี้

ฉันเพิ่มการดำเนินการเพื่อล้างบันทึกจากฐานข้อมูล:

add_action( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );

ตอนนี้ฉันต้องการเรียกใช้การกระทำนี้เป็นระยะ:

wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs' );

และดำเนินการด้วยตนเอง:

do_action( 'myplugin_clean_logs' );

เมธอดMyPlugin_Logs::clean_logsจะส่งคืนจำนวนแถวที่ได้รับผลกระทบหรือเป็นเท็จหากมีสิ่งใดไปในทิศทางอื่น

ตอนนี้ฉันต้องการแสดงจำนวนแถวที่ถูกลบไปแล้ว ฉันจะจินตนาการถึงสิ่งนี้:

$affected_rows = do_action( 'myplugin_clean_logs' );
echo $affected_rows . ' entries have been deleted.';

แต่เนื่องจากdo_actionจะไม่คืนค่าใด ๆ ฉันไม่ทราบวิธีรับค่าตอบแทน

ฉันควรรันเมธอดโดยตรงจากการเรียกใช้ด้วยตนเอง แต่ใช้การดำเนินการกับกำหนดการของเหตุการณ์หรือไม่


1
คุณไม่ต้องการที่จะสะท้อนอะไรในเหตุการณ์ที่กำหนดดังนั้นใช่ฉันจะรันวิธีโดยตรงในการทำงานด้วยตนเอง (ฉันสมมติว่าผู้ดูแลระบบจะเรียกสิ่งนี้และคุณต้องการแสดงผลลัพธ์)
ทิมมาโลน

คำตอบ:


13

สิ่งที่ยอดเยี่ยมคือตัวกรองจะเหมือนกับการดำเนินการเพียงส่งคืนค่าดังนั้นให้ตั้งค่าเป็นตัวกรองแทน:

add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );

แล้วบางสิ่งที่ชอบ:

$affected_rows = '';
$affected_rows = apply_filters( 'myplugin_clean_logs', $affected_rows );

ควรจะผ่าน$affected_rowsไปclean_logs()(และสิ่งที่ฟังก์ชั่นอื่น ๆ ที่คุณอาจจะมีการติดยาเสพติดmyplugin_clean_logs) $affected_rowsและกำหนดค่าตอบแทนกลับไป


4
downvoted เนื่องจากเป็นรหัสแฮ็คแทนที่จะเป็นการพัฒนาซอฟต์แวร์ หากการกระทำเป็นเพียงส่วนหนึ่งของตัวกรองก็ไม่จำเป็นต้องมีตัวกรองใด ๆ Cron ไม่สามารถส่งค่าดังนั้นก็ไม่ควรจะติดยาเสพติดเป็นตัวกรองแม้ว่ารหัสหลักรถช่วยให้คุณทำเช่น shemigans :)
มาร์ค Kaplun

1
จุดที่ถ่าย ฉันได้รับความตั้งใจของสองสิ่งที่แตกต่างกัน แต่เพื่อดูรหัสหลักที่นี่do_action()สิ่งทั้งหมดคือไม่มีอะไรมากกว่าแฮ็คที่ประณีตapply_filters():)
Caspar

ไม่ใช่การออกแบบที่ไม่ดีเพียงอย่างเดียวในแกนกลางซึ่งส่วนหนึ่งเป็นสิ่งที่นำไปสู่ความสับสนที่นำไปสู่คำถามเช่นนี้
Mark Kaplun

1
เราจำเป็นต้องทำงานกับสิ่งที่เรามีดังนั้นในขณะที่ฉันเข้าใจมุมมองของ Mark ฉันยังคงคิดว่านี่เป็นคำตอบที่ถูกต้อง - เว้นแต่แน่นอนว่าจะมีการเปลี่ยนแปลงวิธีการหลักในอนาคต แต่ฉันคิดว่าไม่น่าจะเป็นไปได้ มันจะแนะนำ
ทิมมาโลน

3
ขอบคุณ @TimMalone ฉันขอขอบคุณคำคัดค้านของ @ mark-kaplun คำตอบของฉันอธิบายวิธีการแก้ไขdo_action()ไม่คืนค่ามากกว่าวิธีการออกแบบโซลูชันที่สอดคล้องกับdo_action()เจตนา หากใครบางคนสามารถทำสิ่งที่เขาถามได้คำตอบนั้นควรเป็นคำตอบที่ยอมรับได้ ความคิดแรกของฉันคือการมีวิธีการติดยาเสพติด (สมมติว่า OP ใช้การออกแบบ OOP สำหรับปลั๊กอินนี้) มันเป็นคุณสมบัติที่ได้รับการป้องกันของคลาสปลั๊กอิน แต่นั่นเป็นเพียงขนของความคิด!
Caspar

-1

ไม่เคยใช้ฟังก์ชั่นนี้และยังไม่ได้ทดสอบสิ่งนี้ แต่มันจะใช้ได้ไหม do_action_ref_array ()

function myplugin_clean_logs_fn() {
    $args = array(
        'param1'        => 'val1',
        'param2'        => 'val2',
        'affected_rows' => 0,
    );
    do_action_ref_array( 'myplugin_clean_logs', &$args );
    return $args['affected_rows'];
}

// CALL IT
$affected_rows = my_plugin_clean_logs();
echo $affected_rows .' entr'. ($args['affected_rows']*1===1?'y':'ies') .' deleted.';

// SCHEDULE IT
add_action('myplugin_clean_logs_call_fn', 'myplugin_clean_logs_fn');
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs_call_fn' );

// A SAMPLE FILTER
add_action('myplugin_clean_logs', function($args) {
    // Cleaning process
    // For each log affected, increment $args['affected_rows'] accordingly
}, 10, 3);

หากวิธีนี้ใช้ไม่ได้ผลทำไมไม่เพียงแค่กรองข้อมูลตามที่แนะนำไว้ใน Caspar ฉันหมายถึงนั่นคือจุดประสงค์ของตัวกรองและในกรณีนี้จำนวนแถวที่ได้รับผลกระทบคือสิ่งที่ถูกกรอง (ฉันคิดถึง MortCore เก่าทุกคนจำได้ว่ามันจัดการค่าส่งคืนการส่งต่อโดยอ้างอิงและอาร์กิวเมนต์ด้วยฟังก์ชันพารามิเตอร์สามตัวเดียวหรือไม่?)


นี่คือคำตอบที่น่ากลัวเพราะการส่งผ่านและการแก้ไขค่าโดยการอ้างอิงเป็นการปฏิบัติที่เลว จริงๆแล้วคำตอบนี้ไม่ได้ให้คุณค่าในบริบทของคำถามและน่าจะถูกลบหรือเปลี่ยนเป็นความคิดเห็น นอกจากนี้การใช้ฟังก์ชั่นที่ไม่ระบุชื่อกับ hooks ก็เป็นสิ่งที่ไม่ดีเช่นกันเพราะทำให้ไม่สามารถปลดตะขอได้
Hybrid Web Dev

ฉันเห็นด้วยกับเหตุผลที่กล่าวมาข้างต้นว่านี่ไม่ใช่เส้นทางที่แนะนำ หากคุณจำเป็นต้องรับค่าตอบแทนจากการกระทำด้วยเหตุผลบางอย่างและต้องการสิ่งที่รวดเร็วและสกปรกฉันต้องการโซลูชัน Caspars หากคุณกำลังพัฒนาบางสิ่งบางอย่างที่มีวงจรชีวิตข้างหน้าฉันจะมองหาวิธีที่มีประสิทธิภาพมากขึ้น เมื่อนึกถึงผู้ดูแลระบบจะสังเกตได้อย่างไร developer.wordpress.org/reference/hooks/admin_notices
jgangso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.