¿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 );
}