Obtener una lista de entradas personalizadas por autor

22 jul 2013, 23:38:12
Vistas: 20.7K
Votos: 5

Estoy tratando de crear una página donde un usuario pueda ver todos los tipos de entradas personalizadas después de hacer clic en un autor desde una página anterior, pero no tengo suerte con ninguna de las funciones PHP integradas en WordPress.

¿Existe alguna forma sencilla de hacer esta consulta? No he encontrado mucho en línea al respecto.

2
Comentarios

¿Es un tipo de publicación específico o te refieres a "cualquier cosa que no sea un tipo de publicación principal de WordPress"?

Pat J Pat J
22 jul 2013 23:45:40

Es solo un tipo de publicación personalizado específico.

m0ngr31 m0ngr31
22 jul 2013 23:48:33
Todas las respuestas a la pregunta 2
10

Algo como esto debería funcionar:

// Asumiendo que tienes $author_id definido
// y tu tipo de post se llama 'your_post_type'
$args = array(
    'author' => $author_id,
    'post_type' => 'your_post_type',
);
$author_posts = new WP_Query( $args );
if( $author_posts->have_posts() ) {
    while( $author_posts->have_posts() ) { 
        $author_posts->the_post();
        // título, contenido, etc
        $author_posts->the_title();
        $author_posts->the_content();
        // deberías tener acceso a cualquiera de las etiquetas que normalmente
        // puedes usar en The Loop
    }
    wp_reset_postdata();
}

Referencia

WP_Query class

Usando un archivo de plantilla de Autor

Puedes hacer esto dentro de una plantilla de Autor:

author.php-- este archivo debe ir en el directorio de tu tema

<?php get_header(); ?>

<div id="content" class="narrowcolumn">

<!-- Esto establece la variable $curauth -->

<?php
    $curauth = (isset($_GET['author_name'])) ? 
        get_user_by('slug', $author_name) : 
        get_userdata(intval($author));
?>

<h2>Acerca de: <?php echo $curauth->nickname; ?></h2>
<dl>
    <dt>Sitio web</dt>
    <dd><a href="<?php echo $curauth->user_url; ?>"><?php echo $curauth->user_url; ?></a></dd>
    <dt>Perfil</dt>
    <dd><?php echo $curauth->user_description; ?></dd>
</dl>

<h2>Publicaciones de <?php echo $curauth->nickname; ?>:</h2>

<ul>
<!-- The Loop -->
<?php

// Asumiendo que tu tipo de post se llama 'your_post_type'
$args = array(
    'author' => $curauth->ID,
    'post_type' => 'your_post_type',
);
$author_posts = new WP_Query( $args );
if( $author_posts->have_posts() ) {
    while( $author_posts->have_posts() ) {
        $author_posts->the_post();
        // título, contenido, etc
        the_title();
        the_content();
        // deberías tener acceso a cualquiera de las etiquetas que normalmente
        // puedes usar en The Loop
    }
    wp_reset_postdata();
}
?>

<!-- Fin del Loop -->

</ul>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Este código de la plantilla author.php está descaradamente tomado de el Codex, y probablemente debería considerarse un punto de partida, no un producto final.

22 jul 2013 23:59:38
Comentarios

Sé que recibiré algunas críticas por esto... pero estoy intentando hacer esto con "Allow PHP in Post and Pages" y parece que está teniendo un problema con la declaración if. No logro entender por qué, pero simplemente deja de intentar hacer cualquier cosa tan pronto como llega a ese punto.

m0ngr31 m0ngr31
23 jul 2013 00:26:36

El código que publiqué está pensado para ser añadido a tu archivo functions.php o a un plugin. No tengo experiencia usando el plugin Allow PHP in Posts and Pages(?).

Pat J Pat J
23 jul 2013 00:34:36

¿Cómo lo agregaría al functions.php? No soy muy bueno con PHP. Supongo que tengo que ponerlo en una función, pero no estoy seguro de cómo hacer el add_action o cómo llamarlo desde una página.

m0ngr31 m0ngr31
23 jul 2013 00:48:56

He actualizado mi respuesta.

Pat J Pat J
23 jul 2013 01:55:07

Hola, respuesta tardía, pero estoy probando tu método para las publicaciones de un usuario en un CPT (eventos), pero desafortunadamente termino con un error 500 del servidor en la página de un usuario que realmente ha publicado algo - los usuarios sin publicaciones (es decir, consulta vacía) funcionan bien. ¿Puedes echar un vistazo? Mira un pegado de mi archivo de plantilla de autor (ignora lo de los campos personalizados :) ) aquí: http://pastebin.com/NLNSYC0c . ¡Gracias de antemano!

physalis physalis
19 sept 2014 15:27:32

Actualización: Lo resolví, con mi limitado conocimiento de PHP. De hecho tienes que reemplazar $author_posts->the_title(); con el estándar get_the_title() etc., y funciona perfectamente (mira http://pastebin.com/1FHFGFQs). Gracias por guiarme en la dirección correcta (quizás podrías actualizar tu solución arriba).

physalis physalis
19 sept 2014 15:51:20

He actualizado el código. Si get_the_title() funciona, entonces the_title() y the_content() también deberían hacerlo. (Resulta que estoy haciendo algo bastante similar en un sitio que configuré hace algún tiempo).

Pat J Pat J
19 sept 2014 16:08:14

La primera parte funciona genial. Simplemente usé get_the_author_meta('ID'); para establecer el $author_id.

Jordan Jordan
23 dic 2016 21:30:53

Olvidaste el paréntesis de cierre en la sentencia while:

while( $author_posts->have_posts()) {

Jason Glisson Jason Glisson
11 jul 2020 06:44:22

Así lo hice. Buen ojo. Lo he arreglado ahora.

Pat J Pat J
11 jul 2020 23:46:44
Mostrar los 5 comentarios restantes
2

Utiliza pre_get_posts para añadir tu tipo de contenido personalizado a tu plantilla author.php

En tu functions.php, añade el siguiente código. Esto agregará tu tipo de contenido personalizado a la consulta principal para que aparezca en tu página de autor

function wpse107459_add_cpt_author( $query ) {
    if ( !is_admin() && $query->is_author() && $query->is_main_query() ) {
        $query->set( 'post_type', array('post', 'YOUR_CUSTOM_POST_TYPE' ) );
    }
}
add_action( 'pre_get_posts', 'wpse107459_add_cpt_author' );

Con esto, no es necesario hacer ningún cambio en tus archivos de plantilla :-)

19 sept 2014 16:18:20
Comentarios

Hola @PieterGoosen Esto es casi perfecto para lo que necesito, pero me gustaría mostrar solo el CPT. En la línea $query->set podría simplemente eliminar 'post', pero esto causaría problemas en el blog principal. ¿Sabes cómo podría configurarlo para que el código solo se aplique a tipos de publicaciones personalizados? En pseudocódigo sería: if (post-type('nombre-cpt') { // ejecutar el código } pero no puedo encontrar una solución.

pjk_ok pjk_ok
11 ene 2018 22:53:54

Gracias por esto. Acabo de resolver mi problema después de probar otros 10 métodos diferentes.

Abdul Sadik Yalcin Abdul Sadik Yalcin
7 nov 2018 17:54:40