ricevi $ post nel filtro o nell'azione init?


12

Sembra che $ post sia disponibile solo per gli hook che si eseguono in determinati momenti. Ho un hook "init" che deve estrarre alcuni dati dal database usando $ post-> ID.

Finora la mia unica soluzione è stata quella di aggiungere un altro filtro su the_content, che utilizza $ post per ottenere le informazioni di cui ho bisogno. Sfortunatamente, riecheggia anche il valore restituito sullo schermo e non riesce a restituirlo effettivamente alla funzione che ha originariamente chiamato il filtro.

Ecco il codice che estrae i dati di cui ho bisogno, ma riecheggia e non restituisce il valore:

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

Qualcuno ha qualche suggerimento su come ottenere ciò di cui ho bisogno e farlo tornare alla funzione di chiamata per un uso successivo nel plugin?

EDIT: Per rendere più chiaro questo, ho un filtro in esecuzione su init, che deve essere in grado di recuperare le informazioni sul post corrente dal DB. Per fare ciò, richiede l'accesso a $ post-> ID. Ma ciò non è possibile all'interno di init, quindi come posso ottenere il risultato di cui ho bisogno?

Grazie,

Jonathan

Risolto:

Si scopre che la risposta era semplicemente usare url_to_postid in questo modo:

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

Funziona perfettamente anche da init.


1
è necessario un hook di azione e non un hook di filtro, inoltre initè troppo presto per global $post;essere compreso nell'ambito. forse se descrivi ciò che stai cercando di realizzare ti aiuterà meglio.
Bainternet,

il gancio di azione si comporta esattamente allo stesso modo, ho provato entrambi. So che init è troppo presto, sto cercando di capire come ottenere il risultato di cui ho bisogno - che è un filtro in esecuzione su init che riceve informazioni dal DB che richiede $ post-ID per il recupero.
Jonathan,

Hai davvero bisogno di farlo su init? Perché non in seguito amo?
Rarst

Devo recuperare la parola chiave predefinita per la pagina, se nessuna è già stata fornita nell'URL. Tale parola chiave è memorizzata nel DB e deve essere nota prima che il resto dello script venga eseguito. Come puoi vedere nell'esempio che ho fornito, sono solo in grado di ottenere il valore di cui ho bisogno in the_content, ma poi riecheggia sullo schermo e non passa affatto alla funzione di chiamata. Se hai un'altra soluzione, suggeriscilo.
Jonathan,

Sposta la tua soluzione in una risposta, sarebbe più in linea con la meccanica del sito. Inoltre, non è necessario inserire la soluzione nel titolo: si sarebbe in grado di accettare la risposta e la domanda sarebbe contrassegnata come risposta.
Rarst

Risposte:


12

La risposta è stata semplicemente quella di utilizzare in url_to_postidquesto modo:

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

Funziona perfettamente anche da init.


2

Questo funziona anche in WordPress 4.7:

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

2

Si sono verificati problemi durante l'utilizzo della risposta accettata in quanto non funziona con le porte e le porte multisito . Ecco una soluzione che dovrebbe funzionare in ogni caso:

/**
* 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 );
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.