dapatkan $ post init filter atau action?

12

Tampaknya $ post hanya tersedia untuk kait yang dieksekusi pada waktu-waktu tertentu. Saya memiliki hook "init" yang perlu menarik beberapa data dari database menggunakan $ post-> ID.

Sejauh ini satu-satunya solusi saya adalah menambahkan filter pada the_content, yang menggunakan $ post untuk mendapatkan informasi yang saya butuhkan. Sayangnya, ini juga menggemakan nilai kembali ke layar, dan gagal mengembalikannya ke fungsi yang awalnya disebut filter.

Berikut adalah kode yang mengekstrak data yang saya butuhkan, tetapi menggemakan dan gagal mengembalikan nilainya:

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

Adakah yang punya saran tentang cara mendapatkan apa yang saya butuhkan dan mengembalikannya ke fungsi panggilan untuk digunakan nanti dalam plugin?

EDIT: Agar lebih jelas, saya memiliki filter yang berjalan di init, yang harus dapat mengambil informasi tentang posting saat ini dari DB. Untuk melakukan ini, diperlukan akses ke $ post-> ID. Tetapi itu tidak mungkin dalam init, jadi bagaimana saya bisa mendapatkan hasil yang saya butuhkan?

Terima kasih,

Jonathan

TERPECAHKAN:

Ternyata jawabannya hanya menggunakan url_to_postid seperti ini:

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

Bekerja dengan sempurna bahkan dari init.

Jonathan
sumber
1
Anda memerlukan hook tindakan dan bukan hook filter, juga initterlalu dini untuk global $post;berada dalam ruang lingkup. mungkin jika Anda menggambarkan apa yang Anda coba capai akan membantu lebih baik.
Bainternet
action hook berperilaku dengan cara yang persis sama, saya sudah mencoba keduanya. Saya tahu init terlalu dini, saya mencoba mencari cara untuk mencapai hasil yang saya butuhkan - yaitu filter yang berjalan di init menerima informasi dari DB yang memerlukan $ post-ID untuk mengambil.
Jonathan
Apakah Anda benar - benar perlu melakukan ini di init? Kenapa tidak nanti dikait?
Rarst
Saya harus mengambil kata kunci default untuk halaman, jika belum ada yang disediakan dalam URL. Kata kunci itu disimpan dalam DB, dan harus diketahui sebelum skrip dijalankan. Seperti yang Anda lihat pada contoh yang saya berikan, saya hanya bisa mendapatkan nilai yang saya butuhkan di konten_, tapi kemudian itu bergema ke layar dan tidak kembali ke fungsi panggilan sama sekali. Jika Anda memiliki solusi lain, harap sarankan.
Jonathan
Harap pindahkan solusi Anda ke jawaban, yang akan lebih sesuai dengan mekanika situs. Juga tidak perlu memasukkan judul yang dipecahkan - Anda akan dapat menerima jawaban dan pertanyaan Anda akan ditandai sebagai dijawab.
Paling lambat

Jawaban:

12

Ternyata jawabannya hanya menggunakan url_to_postidseperti ini:

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

Bekerja dengan sempurna bahkan dari init.

JVC
sumber
2

Ini juga berfungsi di WordPress 4.7:

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

Punya masalah menggunakan jawaban yang diterima karena tidak bekerja dengan port dan port multisite . Berikut adalah solusi yang harus bekerja dalam setiap kasus:

/**
* 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 );
}
Blackbam
sumber