Cómo obtener la identificación del autor fuera del ciclo

16

No puedo obtener la ID del autor de la publicación fuera del bucle para hacer que get_the_author_meta funcione. 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 la identificación del autor para pasarlo a:

$address = get_the_author_meta('user_email', $author_id);

¿Alguna sugerencia?

Marce Castro
fuente
mira esto , esto funcionó para mí.
Asaf Chertkoff

Respuestas:

38

La forma más sencilla y directa de obtener la ID del autor de la publicación fuera del ciclo, si conoce la ID de la publicación, es utilizar la función principal de WordPress get_post_field().

$post_author_id = get_post_field( 'post_author', $post_id );

Si aún no conoce el ID de publicación de la página en la que se encuentra, desde WP 3.1 lo más fácil es usar la función get_queried_object_id()(búsquela en la lista de Métodos) que funciona incluso fuera del ciclo.

$post_id = get_queried_object_id();

Si esto no funciona para usted, brinde una explicación más detallada de dónde está tratando de ejecutar su código y podemos ver si podemos ayudarlo más.

Max GJ Panas
fuente
9

Aquí le mostramos cómo obtener y obtener la identificación del autor fuera del ciclo de WordPress:

<?php
global $post;
$author_id=$post->post_author;
?>

Entonces es posible para nosotros the_author_meta:

<?php
the_author_meta( 'user_nicename', $author_id );
?>
Alexander Poslavsky
fuente
Esto funciona muy bien si tiene acceso a la ID de publicación. También puede usar get_the_author_meta ('user_nicename', $ author_id) si no desea generar el valor de inmediato
Andrew M
3

Depende de donde estes. Si está en una página singular (p. Ej., Solo muestra un solo {{Insertar tipo de publicación aquí}}), puede usar get_queried_object, lo que buscará el objeto de publicación.

<?php
if (is_singular()) {
    $author_id = get_queried_object()->post_author;
    $address = get_the_author_meta('user_email', $author_id);
}

Si está en otro lugar, puede usar el $wp_queryobjeto global y verificar su $postspropiedad. 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 puede simplemente "iniciar en falso" el bucle y rebobinarlo para obtener la identificación del autor. Esto no generará ningún impacto adicional en la base de datos o similares. WordPress recupera todas las publicaciones a la vez (en el momento de la escritura). rewind_postssimplemente restablece el objeto de publicación actual (el global $post) al comienzo de la matriz. La desventaja es que esto puede hacer que la loop_startacción se dispare mucho antes de lo que quieres, no es un gran problema, solo algo a tener en cuenta.

<?php
// make sure you're at the beginning.
rewind_posts();

// start the loop
the_post();

// get what you need
$address = get_the_author_meta('user_email');

// back to normal
rewind_posts();
chrisguitarguy
fuente
2

Parece que funciona fuera del ciclo, tal vez esto ayude.

    $thelogin = get_query_var('author_name');
    $theauthor = get_userdatabylogin($thelogin);

También puede establecer manualmente la ID de la publicación y tomarla de esta manera:

global $wp_query;
$thePostID = $wp_query->post->ID;
$postdata = get_post($thePostID, ARRAY_A);
$authorID = $postdata['post_author'];

Cambie la identificación para publicar la identificación manualmente para acceso fuera del bucle.

No son buenas soluciones, pero espero que ayude.

Ryan Dennler
fuente
0

Tuve el mismo problema aquí cuando intentaba hacer un widget que mostrara publicaciones destacadas con información del autor.

Usé algunas de las pistas de @chrisguitarguy 2nd tip.

Mi código se veía así:

<?php    

$count = 0;
$query_args = array(
      'posts_per_page' => 5,
     );
$com_query = new WP_Query( $query_args );

$feat_posts = $com_query->posts; // array, so we can access each post based on position

while ($com_query->have_posts()) {              
    $com_query->the_post();
        $author_name= get_the_author_meta('user_nicename',  $feat_posts[$count]->post_author);
        $count++;
}
Richard Dinh
fuente
0

Para obtener y obtener la identificación del autor fuera del ciclo:

global $post;
$author_id = $post->post_author;

Luego usa

get_the_author_meta('field_name', $author_id)

recuerde que si está recuperando la identificación de las publicaciones en el bucle y accediendo al autor fuera del bucle, solo proporcionará datos de la última identificación de la publicación en el bucle

Manish Chaubey
fuente
0

Esperemos que esto ayude:

$args= array(
    'post_type' =>'any',
    'post_status' => 'publish',
    'order' => 'ASC',
    'posts_per_page' => '-1'
);
$posts = new WP_Query($args);
$posts = $posts->posts;   

foreach($posts as $post) { 
  switch ($post->post_type) {
     case 'page': 
           // get the author's id through the post or page
           $id = get_post_field( 'post_author', $post->ID);
           // the first parameter is the name of the author 
           // of the post or page and the second parameter 
           // is the id with which the function obtains the name of the author.
           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);
  }
}
Alejandro Jose Velasquez Valle
fuente
-2

¿Por qué no usas the_author_meta?

<p>The email address for user id 25 is <?php the_author_meta('user_email',25); ?></p>

Esto se puede usar dentro del bucle

Daftary Kuldeep
fuente
Gracias, pero el problema es que estoy fuera del circuito y no puedo solucionarlo. Cuando está fuera del ciclo, se debe proporcionar el segundo argumento ($ author_id).
Marce Castro
¡Bache! ¿Algunas ideas? Me está volviendo loco: - /
Marce Castro
44
fuera del circuito , tenga en cuenta la pregunta.
Christine Cooper