Ottenere $post nel filtro o azione init?

13 lug 2011, 10:45:46
Visualizzazioni: 16.4K
Voti: 15

Sembra che $post sia disponibile solo per gli hook eseguiti in determinati momenti. Ho un hook "init" che deve recuperare alcuni dati dal database utilizzando $post->ID.

Finora l'unica soluzione alternativa è stata aggiungere un altro filtro su the_content, che usa $post per ottenere le informazioni necessarie. Sfortunatamente, restituisce anche il valore a schermo e non lo restituisce alla funzione che ha chiamato il filtro.

Ecco il codice che estrae i dati necessari, ma li visualizza 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 suggerimenti su come ottenere ciò di cui ho bisogno e farlo passare alla funzione chiamante per un uso successivo nel plugin?

EDIT: Per chiarire meglio, ho un filtro in esecuzione su init che deve recuperare informazioni sul post corrente dal DB. Per farlo, ha bisogno di accedere a $post->ID. Ma questo non è possibile dentro init, quindi come posso ottenere il risultato?

Grazie,

Jonathan

RISOLTO:

La soluzione era semplicemente usare url_to_postid così:

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

Funziona perfettamente anche da init.

5
Commenti

hai bisogno di un action hook e non di un filter hook, inoltre init è troppo presto perché global $post; sia nello scope. forse se descrivi quello che stai cercando di ottenere potrebbe aiutare meglio.

Bainternet Bainternet
13 lug 2011 11:35:17

l'action hook 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 - ovvero un filtro che viene eseguito su init ricevendo informazioni dal DB che richiedono $post-ID per essere recuperate.

Jonathan Jonathan
13 lug 2011 19:02:03

Hai davvero bisogno di farlo su init? Perché non usare un hook successivo?

Rarst Rarst
13 lug 2011 22:08:32

Devo recuperare la parola chiave predefinita per la pagina, se nessuna è già stata fornita nell'URL. Questa parola chiave è memorizzata nel database e deve essere conosciuta prima che qualsiasi altra parte dello script venga eseguita. Come puoi vedere nell'esempio che ho fornito, riesco a ottenere il valore che mi serve solo in the_content, ma poi viene visualizzato a schermo e non viene passato alla funzione chiamante. Se hai un'altra soluzione, per favore suggeriscila.

Jonathan Jonathan
13 lug 2011 22:47:39

Per favore sposta la tua soluzione in una risposta, sarebbe più in linea con le dinamiche del sito. Inoltre non c'è bisogno di mettere risolto nel titolo - potrai accettare la risposta e la tua domanda verrà contrassegnata come risposta.

Rarst Rarst
15 lug 2011 12:26:52
Tutte le risposte alla domanda 3
0
16

Si è scoperto che la risposta era semplicemente utilizzare 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.

10 ott 2011 06:12:55
0

Ho avuto problemi utilizzando la risposta accettata perché non funziona con le porte e le porte multisito. Ecco una soluzione che dovrebbe funzionare in ogni caso:

/**
* Nota: Questa funzione funzionerà solo su POST/PAGINE/TIPI DI POST SINGOLARI
*/
function get_early_postid() {
    return url_to_postid((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}

// esempio
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 lug 2018 18:27:29
0

Funziona anche in WordPress 4.7:

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