รับ $ post ในตัวกรอง init หรือการกระทำ


12

ดูเหมือนว่า $ โพสต์จะมีให้เฉพาะเมื่อสั่งการบางเวลาเท่านั้น ฉันมีเบ็ด "init" ที่ต้องการดึงข้อมูลบางส่วนจากฐานข้อมูลโดยใช้ $ post-> ID

จนถึงตอนนี้วิธีแก้ปัญหาเดียวของฉันคือการเพิ่มตัวกรองอื่นใน the_content ที่ใช้ $ post เพื่อรับข้อมูลที่ฉันต้องการ น่าเสียดายที่มันสะท้อนกลับมาที่ค่าหน้าจอและล้มเหลวในการกลับไปที่ฟังก์ชั่นที่เรียกว่าตัวกรองเดิม

นี่คือรหัสที่ดึงข้อมูลที่ฉันต้องการ แต่ก้องและล้มเหลวในการคืนค่า:

add_filter('the_content', 'get_keyword');
function get_keyword()
{
    global $post;
    $keyword = get_post_meta( $post->ID, '_wpg_def_keyword', true );
    return $keyword;
}

ใครบ้างมีข้อเสนอแนะเกี่ยวกับวิธีการรับสิ่งที่ฉันต้องการและให้มันกลับไปที่ฟังก์ชั่นการโทรสำหรับใช้ในภายหลังในปลั๊กอิน?

แก้ไข: เพื่อให้ชัดเจนยิ่งขึ้นฉันมีตัวกรองทำงานอยู่ที่ init ซึ่งต้องสามารถดึงข้อมูลในโพสต์ปัจจุบันจากฐานข้อมูลได้ ในการดำเนินการนี้ต้องมีการเข้าถึง $ post-> ID แต่มันเป็นไปไม่ได้ภายใน init ดังนั้นฉันจะได้ผลลัพธ์ที่ต้องการได้อย่างไร

ขอบคุณ

โจนาธาน

การแก้ไข:

กลายเป็นคำตอบก็แค่ใช้ url_to_postid เช่นนี้:

$keyword = get_post_meta(
     url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ),
     '_wpg_def_keyword',
     true
);

ทำงานได้อย่างสมบูรณ์แบบแม้กระทั่งจาก init


1
คุณต้องมี hook action และไม่ใช่ hook filter แต่ยังinitเร็วเกินไปglobal $post;ที่จะอยู่ในขอบเขต บางทีถ้าคุณอธิบายสิ่งที่คุณพยายามทำสำเร็จจะช่วยได้ดีกว่า
Bainternet

action hook ทำงานในลักษณะเดียวกันฉันได้ลองทั้งสองอย่างแล้ว ฉันรู้ว่า init เร็วเกินไปฉันพยายามหาวิธีทำให้ได้ผลลัพธ์ตามที่ต้องการซึ่งเป็นตัวกรองที่รับข้อมูลจากฐานข้อมูลที่ต้องใช้ $ post-ID เพื่อดึงข้อมูล
Jonathan

คุณจำเป็นต้องทำสิ่งนี้กับ init หรือไม่? ทำไมไม่ลองทีหลัง
Rarst

ฉันต้องดึงคำค้นหาเริ่มต้นสำหรับหน้านั้นหากไม่ได้ระบุไว้ใน URL แล้ว คำสำคัญนั้นถูกเก็บไว้ในฐานข้อมูลและต้องเป็นที่รู้จักก่อนที่สคริปต์ส่วนที่เหลือจะทำงาน อย่างที่คุณเห็นในตัวอย่างที่ฉันให้ฉันสามารถรับค่าที่ฉันต้องการใน the_content เท่านั้น แต่จากนั้นมันจะสะท้อนไปที่หน้าจอและไม่ส่งกลับไปยังฟังก์ชันการโทรเลย หากคุณมีวิธีอื่นโปรดแนะนำ
Jonathan

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

คำตอบ:


12

กลับกลายเป็นคำตอบก็คือการใช้url_to_postidเช่นนี้:

$keyword = get_post_meta( url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ), '_wpg_def_keyword', true );

initทำงานอย่างสมบูรณ์แบบแม้จะมาจาก


2

สิ่งนี้ยังทำงานใน WordPress 4.7:

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true ); 

2

ปัญหาที่เกิดขึ้นมีการใช้คำตอบที่ได้รับการยอมรับในขณะที่มันไม่ได้ทำงานกับพอร์ตและพอร์ต MultiSite การ นี่คือทางออกที่ควรใช้ในทุกกรณี:

/**
* Note: This function will only work on SINGULAR posts/pages/post types
*/
function get_early_postid() {
    return url_to_postid((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}

// demo
add_action('init','my_super_early_meta_action');

function my_super_early_meta_action() {
    $keyword = get_post_meta( get_early_postid(), '_wpg_def_keyword', true );
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.