¿Cómo obtener $post en el filtro o acción init en WordPress?
Parece que $post solo está disponible para hooks que se ejecutan en momentos específicos. Tengo un hook "init" que necesita obtener datos de la base de datos usando $post->ID.
Hasta ahora, mi única solución ha sido agregar otro filtro en the_content, que usa $post para obtener la información que necesito. Desafortunadamente, también muestra el valor de retorno en pantalla y no lo devuelve a la función que llamó originalmente al filtro.
Aquí está el código que extrae los datos que necesito, pero los muestra y no devuelve el valor:
add_filter('the_content', 'get_keyword');
function get_keyword()
{
global $post;
$keyword = get_post_meta( $post->ID, '_wpg_def_keyword', true );
return $keyword;
}
¿Alguien tiene alguna sugerencia sobre cómo obtener lo que necesito y que pase de vuelta a la función llamadora para su uso posterior en el plugin?
EDITADO: Para aclarar posiblemente, tengo un filtro que se ejecuta en init, que necesita poder recuperar información sobre el post actual de la base de datos. Para esto, requiere acceso a $post->ID. Pero esto no es posible dentro de init, ¿cómo puedo obtener el resultado que necesito?
Gracias,
Jonathan
SOLUCIÓN:
Resulta que la respuesta era simplemente usar url_to_postid así:
$keyword = get_post_meta(
url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ),
'_wpg_def_keyword',
true
);
Funciona perfectamente incluso desde init.

Resulta que la respuesta era simplemente usar url_to_postid
de esta manera:
$keyword = get_post_meta( url_to_postid( "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] ), '_wpg_def_keyword', true );
Funciona perfectamente incluso desde init
.

Tuve problemas al usar la respuesta aceptada ya que no funciona con puertos ni puertos en multisitio. Aquí hay una solución que debería funcionar en todos los casos:
/**
* Nota: Esta función solo funcionará en publicaciones/páginas/tipos de publicación INDIVIDUALES
*/
function get_early_postid() {
return url_to_postid((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
}
// demostración
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 );
}
