Cómo obtener el ID del autor fuera del bucle
No puedo obtener el ID del autor de la entrada fuera del bucle para hacer funcionar get_the_author_meta. Hasta ahora he probado diferentes enfoques:
1.
$author_id=$post->post_author;
2.
global $post;
$author_id=$post->post_author;
3.
$post_tmp = get_post($post_id);
$author_id = $post_tmp->post_author;
4.
$author_id = $posts[0]->post_author;
Necesito el ID del autor para pasarlo a:
$address = get_the_author_meta('user_email', $author_id);
¿Alguna sugerencia?
La forma más sencilla y directa de obtener el ID del autor de una entrada fuera del bucle, si conoces el ID de la entrada, es usar la función principal de WordPress get_post_field()
.
$post_author_id = get_post_field( 'post_author', $post_id );
Si aún no conoces el ID de la entrada de la página en la que estás, entonces desde WP 3.1 lo más fácil es usar la función get_queried_object_id()
(búscala en la lista de Métodos) que funciona incluso fuera del bucle.
$post_id = get_queried_object_id();
Si estos métodos no funcionan para ti, por favor proporciona una explicación más detallada de dónde estás intentando ejecutar tu código y podremos ver si podemos ayudarte más.

Depende de dónde te encuentres. Si estás en una página singular (por ejemplo, mostrando solo un único {{Insertar Tipo de Publicación Aquí}}), podrías usar get_queried_object
, que obtendrá el objeto de la publicación.
<?php
if (is_singular()) {
$author_id = get_queried_object()->post_author;
$address = get_the_author_meta('user_email', $author_id);
}
Si estás en cualquier otro lugar, podrías usar el objeto global $wp_query
y verificar su propiedad $posts
. Esto también debería funcionar en páginas singulares.
<?php
global $wp_query;
if (!empty($wp_query->posts)) {
$author_id = $wp_query->posts[0]->post_author;
$address = get_the_author_meta('user_email', $author_id);
}
También puedes simplemente "iniciar falsamente" el bucle y rebobinarlo para obtener el ID del autor. Esto no generará consultas adicionales a la base de datos ni nada por el estilo. WordPress obtiene todas las publicaciones de una vez (al momento de escribir esto). rewind_posts
simplemente reinicia la publicación actual (el objeto global $post
) al principio del arreglo. La desventaja es que esto puede hacer que la acción loop_start
se dispare mucho antes de lo que deseas, no es un gran problema, solo algo que debes tener en cuenta.
<?php
// asegúrate de estar al principio.
rewind_posts();
// inicia el bucle
the_post();
// obtén lo que necesitas
$address = get_the_author_meta('user_email');
// vuelve a la normalidad
rewind_posts();

Parece que esto funciona fuera del bucle, tal vez esto te ayude.
$thelogin = get_query_var('author_name');
$theauthor = get_userdatabylogin($thelogin);
También podrías establecer manualmente el ID de la publicación y obtenerlo de esta manera:
global $wp_query;
$thePostID = $wp_query->post->ID;
$postdata = get_post($thePostID, ARRAY_A);
$authorID = $postdata['post_author'];
Cambia el ID manualmente por el ID de la publicación para acceder fuera del bucle.
No son soluciones perfectas, pero espero que te ayuden.

Tuve el mismo problema aquí al intentar crear un widget que mostrara publicaciones destacadas con información del autor.
Utilicé algunas de las sugerencias del segundo consejo de @chrisguitarguy.
Mi código se veía así:
<?php
$count = 0;
$query_args = array(
'posts_per_page' => 5, // Número de publicaciones a mostrar
);
$com_query = new WP_Query( $query_args ); // Crear una nueva consulta WP_Query
$feat_posts = $com_query->posts; // array, para acceder a cada publicación según su posición
while ($com_query->have_posts()) {
$com_query->the_post();
$author_name= get_the_author_meta('user_nicename', $feat_posts[$count]->post_author); // Obtener el nombre del autor
$count++;
}

Espero que esto ayude:
$args= array(
'post_type' =>'any', // Cualquier tipo de publicación
'post_status' => 'publish', // Solo publicaciones publicadas
'order' => 'ASC', // Orden ascendente
'posts_per_page' => '-1' // Todos los posts
);
$posts = new WP_Query($args);
$posts = $posts->posts;
foreach($posts as $post) {
switch ($post->post_type) {
case 'page':
// Obtener el ID del autor a través del post o página
$id = get_post_field( 'post_author', $post->ID);
// El primer parámetro es el nombre del autor
// del post o página y el segundo parámetro
// es el ID con el que la función obtiene el nombre del autor.
echo get_the_author_meta('display_name', $id);
break;
case 'post':
$id = get_post_field( 'post_author', $post->ID);
echo get_the_author_meta('display_name', $id);
}
}

Para obtener el ID del autor fuera del bucle (loop):
global $post;
$author_id = $post->post_author;
Luego usa:
get_the_author_meta('nombre_del_campo', $author_id)
Recuerda que si estás obteniendo IDs de publicaciones dentro del bucle y accediendo al autor fuera del bucle, solo proporcionará los datos del último ID de publicación en el bucle.

¿Por qué no usas the_author_meta
<p>La dirección de correo electrónico para el usuario con ID 25 es <?php the_author_meta('user_email',25); ?></p>
Esto puede ser utilizado dentro del bucle (loop)

Gracias, pero el problema es que estoy fuera del bucle y no puedo solucionarlo. Cuando estás fuera del bucle, es necesario proporcionar el segundo argumento ($author_id).
