¿Cómo obtener $post en el filtro o acción init en WordPress?

13 jul 2011, 10:45:46
Vistas: 16.4K
Votos: 15

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.

5
Comentarios

necesitas un hook de acción y no uno de filtro, además init es demasiado temprano para que global $post; esté en el alcance. Tal vez si describes lo que intentas lograr ayudaría más.

Bainternet Bainternet
13 jul 2011 11:35:17

el hook de acción se comporta exactamente igual, he probado ambos. Sé que init es demasiado temprano, estoy tratando de averiguar cómo lograr el resultado que necesito - que es un filtro que se ejecuta en init recibiendo información de la BD que requiere $post-ID para recuperar.

Jonathan Jonathan
13 jul 2011 19:02:03

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

Rarst Rarst
13 jul 2011 22:08:32

Necesito recuperar la palabra clave predeterminada para la página, si no se ha proporcionado ninguna en la URL. Esa palabra clave está almacenada en la base de datos y debe conocerse antes de que se ejecute el resto del script. Como puedes ver en el ejemplo que proporcioné, solo puedo obtener el valor que necesito en the_content, pero luego se imprime en pantalla y no se devuelve a la función que lo llama. Si tienes otra solución, por favor sugierela.

Jonathan Jonathan
13 jul 2011 22:47:39

Por favor mueve tu solución a una respuesta, eso estaría más en línea con la mecánica del sitio. Además no es necesario poner resuelto en el título - podrás aceptar la respuesta y tu pregunta quedará marcada como respondida.

Rarst Rarst
15 jul 2011 12:26:52
Todas las respuestas a la pregunta 3
0
16

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.

10 oct 2011 06:12:55
0

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 );
}
3 jul 2018 18:27:29
0

Esto también funciona en WordPress 4.7:

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