obtener todos los IDs de posts de una categoría

4 nov 2012, 03:11:17
Vistas: 45.2K
Votos: 7

Problema: Necesito obtener un array de IDs de posts de una categoría determinada si la categoría tiene algún post. Esto será usado en una página de opciones de un plugin.

Hasta ahora tengo:

$posts = get_posts(array('numberposts' => 10000, 'category' => 5));

Pero estoy teniendo dificultades sobre cómo obtener un array que contenga solo el ID de cada post en esa categoría.

¿Alguna idea? Gracias

0
Todas las respuestas a la pregunta 2
0
16

Lo importante que hay que recordar sobre get_posts es que utiliza internamente un objeto WP_Query. Código fuente de get_posts:

<?php
/**
 * Recupera una lista de las últimas publicaciones o publicaciones que coinciden con los criterios.
 *
 * Los valores predeterminados son los siguientes:
 *     'numberposts' - Por defecto es 5. Número total de publicaciones a recuperar.
 *     'offset' - Por defecto es 0. Ver {@link WP_Query::query()} para más información.
 *     'category' - De qué categoría obtener las publicaciones.
 *     'orderby' - Por defecto es 'post_date'. Cómo ordenar las publicaciones.
 *     'order' - Por defecto es 'DESC'. El orden para recuperar las publicaciones.
 *     'include' - Ver {@link WP_Query::query()} para más información.
 *     'exclude' - Ver {@link WP_Query::query()} para más información.
 *     'meta_key' - Ver {@link WP_Query::query()} para más información.
 *     'meta_value' - Ver {@link WP_Query::query()} para más información.
 *     'post_type' - Por defecto es 'post'. Puede ser 'page', o 'attachment' entre otros.
 *     'post_parent' - El padre de la publicación o tipo de publicación.
 *     'post_status' - Por defecto es 'publish'. Estado de la publicación a recuperar.
 *
 * @since 1.2.0
 * @uses $wpdb
 * @uses WP_Query::query() Ver para más argumentos predeterminados e información.
 * @link http://codex.wordpress.org/Template_Tags/get_posts
 *
 * @param array $args Opcional. Sobrescribe los valores predeterminados.
 * @return array Lista de publicaciones.
 */
function get_posts($args = null) {
    $defaults = array(
        'numberposts' => 5, 'offset' => 0,
        'category' => 0, 'orderby' => 'post_date',
        'order' => 'DESC', 'include' => array(),
        'exclude' => array(), 'meta_key' => '',
        'meta_value' =>'', 'post_type' => 'post',
        'suppress_filters' => true
    );

    $r = wp_parse_args( $args, $defaults );
    if ( empty( $r['post_status'] ) )
        $r['post_status'] = ( 'attachment' == $r['post_type'] ) ? 'inherit' : 'publish';
    if ( ! empty($r['numberposts']) && empty($r['posts_per_page']) )
        $r['posts_per_page'] = $r['numberposts'];
    if ( ! empty($r['category']) )
        $r['cat'] = $r['category'];
    if ( ! empty($r['include']) ) {
        $incposts = wp_parse_id_list( $r['include'] );
        $r['posts_per_page'] = count($incposts);  // solo el número de publicaciones incluidas
        $r['post__in'] = $incposts;
    } elseif ( ! empty($r['exclude']) )
        $r['post__not_in'] = wp_parse_id_list( $r['exclude'] );

    $r['ignore_sticky_posts'] = true;
    $r['no_found_rows'] = true;

    $get_posts = new WP_Query;
    return $get_posts->query($r);

}

Lo cual significa, por supuesto, que puedes usar los mismos argumentos que acepta WP_Query. Esto incluye parámetros relacionados con campos.

Para obtener un arreglo solo de IDs, necesitarías hacer algo como esto:

<?php
$post_ids = get_posts(array(
    'numberposts'   => -1, // obtener todas las publicaciones.
    'tax_query'     => array(
        array(
            'taxonomy'  => 'category',
            'field'     => 'id',
            'terms'     => 5,
        ),
    ),
    'fields'        => 'ids', // Solo obtener IDs de publicaciones
));

O puedes envolverlo en una función para mayor flexibilidad.

<?php
function wpse71471_get_post_ids($cat, $taxonomy='category')
{
    return get_posts(array(
        'numberposts'   => -1, // obtener todas las publicaciones.
        'tax_query'     => array(
            array(
                'taxonomy'  => $taxonomy,
                'field'     => 'id',
                'terms'     => is_array($cat) ? $cat : array($cat),
            ),
        ),
        'fields'        => 'ids', // solo obtener IDs de publicaciones.
    ));
}
4 nov 2012 03:30:04
2

Por favor, consulta el siguiente artículo: Obtener IDs de publicaciones desde WP_Query?

Deberías estar usando: wp_list_pluck

Ejemplo:

// Obtener IDs de publicaciones del tipo 'contact'
$ids = get_posts( array(
    'post_type' => 'contact', // Tipo de publicación
    'pages_per_post' => -1,   // Mostrar todas las publicaciones
) );

// Mostrar los IDs obtenidos
var_dump(wp_list_pluck( $ids, 'ID' ));
27 oct 2015 03:29:23
Comentarios

Esto sigue siendo muy, muy costoso. Estás devolviendo el objeto completo de cada publicación. Si tienes más de 1000 publicaciones, tu consulta podría agotar el tiempo de espera. La solución más fácil y mejor es establecer el parámetro fields en ids, esto solo devolverá los IDs. Esto ahorra una GRAN cantidad de llamadas a la base de datos y tiempo de ejecución de la consulta.

Pieter Goosen Pieter Goosen
27 oct 2015 06:21:07

La respuesta de @s_ha_dum de la publicación enlazada es la forma correcta si solo quieres obtener los IDs de las publicaciones.

Pieter Goosen Pieter Goosen
27 oct 2015 06:22:29