นี่คือวิธีแก้ปัญหาบางอย่าง:
วิธีการ # 1
คุณสามารถตัดคำจำกัดความposts_where
ของรหัสย่อและการเรียกกลับของตัวกรองในคลาสเพื่อให้สามารถส่งผ่านค่าที่กำหนดระหว่างวิธีการเรียนเช่นเป็นตัวแปรส่วนตัว
วิธีการ # 2
อีกวิธีหนึ่งคือการส่งผ่านค่าเป็นอินพุตไปยังWP_Query
การเรียกกลับของรหัสย่อของคุณ:
$query = new WP_Query ( [ 'wpse_value' => 5, ... ] );
จากนั้นภายในตัวกรอง posts_where ของคุณคุณสามารถเข้าถึงได้:
add_filter( 'posts_where', function( $where, \WP_Query $query )
{
if( $value = $query->get( 'wpse_value' ) )
{
// can use $value here
}
return $where;
}, 10, 2 );
วิธีการ # 3
... หรือคุณสามารถปรับตัวอย่างโดย @the_dramatist เพื่อให้สามารถลบการเรียกกลับหลังจากนั้นโดยการกำหนดฟังก์ชันที่ไม่ระบุชื่อให้กับตัวแปร:
function my_shortcode_function( $atts, $content )
{
// shortcode_atts stuff here
$value = 5; // just an example
// Add a filter's callback
add_filter( 'posts_where', $callback = function( $where ) use ( $value ) {
// $value accessible here
return $where;
} );
// WP_Query stuff here and setup $out
// Remove the filter's callback
remove_filter( 'posts_where', $callback );
return $out;
}
add_shortcode( 'my-shortcode', 'my_shortcode_function' );
ตรวจสอบเช่นเอกสาร PHPเกี่ยวกับวิธีการกำหนดฟังก์ชั่นที่ไม่ระบุชื่อกับคำหลักการใช้งานให้กับตัวแปร
ป.ล. : ฉันคิดว่าฉันได้เรียนรู้เกี่ยวกับตัวแปรนี้เป็นครั้งแรกโดยใช้ @gmazzap เพื่อให้ง่ายต่อการลบการโทรกลับของตัวกรองที่ไม่ระบุชื่อ
หวังว่ามันจะช่วย!
$GLOBALS['value'] = some value
แล้วเรียก$GLOBALS['value']
มันใช้งานได้ แต่ถ้าฉันตั้งค่าโดยตรงเป็น$value = some value
แล้วโทรมันใช้$GLOBALS['value']
มันไม่ทำงานในขณะที่มันควรจะทำงานตามคู่มือ PHP