obtener $ post en el filtro de inicio o acción?


12

Parece que $ post solo está disponible para ganchos que se ejecutan en ciertos momentos. Tengo un gancho "init" que necesita extraer algunos 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 hace eco del valor de retorno en la pantalla y no puede devolverlo a la función que llamó originalmente al filtro.

Aquí está el código que extrae los datos que necesito, pero hace eco 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 hacer que vuelva a la función de llamada para su uso posterior en el complemento?

EDITAR: Para posiblemente aclarar esto, tengo un filtro ejecutándose en init, que necesita poder recuperar información de la publicación actual de la base de datos. Para hacer esto, requiere acceso a $ post-> ID. Pero eso no es posible dentro de init, entonces, ¿cómo puedo obtener el resultado que necesito?

Gracias,

Jonathan

RESUELTO

Resulta que la respuesta fue 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.


1
necesita un gancho de acción y no un gancho de filtro, también inites demasiado pronto para global $post;estar dentro del alcance. tal vez si describe lo que está tratando de lograr le ayudará mejor.
Bainternet

El gancho de acción se comporta exactamente de la misma manera, he probado ambos. Sé que init es demasiado temprano, estoy tratando de descubrir cómo lograr el resultado que necesito, que es un filtro que se ejecuta en init y recibe información del DB que requiere $ post-ID para recuperarse.
Jonathan

¿Realmente necesitas hacer esto en init? ¿Por qué no más tarde enganchar?
Rarst

Tengo que recuperar la palabra clave predeterminada para la página, si ya no se ha proporcionado ninguna en la URL. Esa palabra clave se almacena en la base de datos y debe conocerse antes de que se ejecute el resto del script. Como puede ver en la muestra que proporcioné, solo puedo obtener el valor que necesito en the_content, pero luego hace eco en la pantalla y no vuelve a la función de llamada. Si tiene otra solución, sugiérala.
Jonathan

Mueva su solución a una respuesta, que estaría más en línea con la mecánica del sitio. Tampoco es necesario poner resuelto en el título: podrá aceptar la respuesta y su pregunta se marcará como contestada.
Rarst

Respuestas:


12

Resulta que la respuesta fue simplemente usar url_to_postidasí:

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

Funciona perfectamente incluso desde init.


2

Esto también funciona en WordPress 4.7:

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

2

Tuve problemas al usar la respuesta aceptada, ya que no funciona con puertos y puertos multisitio . Aquí hay una solución que debería funcionar en todos los casos:

/**
* 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 );
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.