Cum să obții $post în filtrul sau acțiunea init?

13 iul. 2011, 10:45:46
Vizualizări: 16.4K
Voturi: 15

Se pare că variabila $post este disponibilă doar pentru anumite hook-uri care rulează la momente specifice. Am un hook "init" care trebuie să extragă niște date din baza de date folosind $post->ID.

Până acum, singura soluție a fost să adaug un alt filtru pe the_content, care folosește $post pentru a obține informațiile necesare. Din păcate, acesta afișează valoarea returnată pe ecran și nu o returnează efectiv funcției care a apelat filtrul inițial.

Iată codul care extrage datele de care am nevoie, dar le afișează și nu returnează valoarea:

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

Are cineva sugestii despre cum să obțin ceea ce am nevoie și să o transmit înapoi funcției apelante pentru utilizare ulterioară în plugin?

EDIT: Pentru a clarifica, am un filtru care rulează la init, care trebuie să poată prelua informații despre postarea curentă din baza de date. Pentru asta, are nevoie de acces la $post->ID. Dar acest lucru nu este posibil în interiorul init, deci cum pot obține rezultatul dorit?

Mulțumesc, Jonathan

REZOLVAT:

Se pare că soluția a fost să folosesc url_to_postid astfel:

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

Funcționează perfect chiar și din init.

5
Comentarii

ai nevoie de un action hook și nu de un filter hook, de asemenea init este prea devreme pentru global $post; să fie în scope. poate dacă descrii ce încerci să realizezi va ajuta mai bine.

Bainternet Bainternet
13 iul. 2011 11:35:17

action hook se comportă exact la fel, am încercat pe ambele. Știu că init este prea devreme, încerc să aflu cum să realizez rezultatul de care am nevoie - adică un filtru care rulează la init primind informații din baza de date care necesită $post-ID pentru a fi preluate.

Jonathan Jonathan
13 iul. 2011 19:02:03

Chiar ai nevoie să faci asta la init? De ce nu un hook mai târziu?

Rarst Rarst
13 iul. 2011 22:08:32

Trebuie să preiau cuvântul cheie implicit pentru pagină, dacă nu a fost furnizat deja în URL. Acel cuvânt cheie este stocat în baza de date și trebuie să fie cunoscut înainte de executarea oricărui alt script. După cum puteți vedea în exemplul pe care l-am furnizat, reușesc să obțin valoarea necesară doar în the_content, dar apoi aceasta este afișată pe ecran și nu este transmisă înapoi către funcția apelantă. Dacă aveți o altă soluție, vă rog să o sugerați.

Jonathan Jonathan
13 iul. 2011 22:47:39

Vă rugăm să mutați soluția dvs. într-un răspuns, asta ar fi mai în concordanță cu mecanismele site-ului. De asemenea, nu este nevoie să puneți rezolvat în titlu - veți putea accepta răspunsul și întrebarea dvs. va fi marcată ca răspunsă.

Rarst Rarst
15 iul. 2011 12:26:52
Toate răspunsurile la întrebare 3
0
16

Se pare că răspunsul a fost pur și simplu să folosim url_to_postid astfel:

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

Funcționează perfect chiar și din init.

10 oct. 2011 06:12:55
0

Am avut probleme folosind răspunsul acceptat deoarece nu funcționează cu porturi și porturi multisite. Iată o soluție care ar trebui să funcționeze în orice situație:

/**
* Notă: Această funcție va funcționa doar pe postări/pagini/tipuri de postări SINGULARE
*/
function get_early_postid() {
    return url_to_postid((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}

// demonstrație
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 );
}
3 iul. 2018 18:27:29
0

Acest lucru funcționează și în WordPress 4.7:

$postID = url_to_postid( $_SERVER['REQUEST_URI'] , '_wpg_def_keyword', true ); 
21 feb. 2017 07:04:24