Ottenere tutti gli ID dei post da una categoria

4 nov 2012, 03:11:17
Visualizzazioni: 45.2K
Voti: 7

Problema: Ho bisogno di ottenere un array di ID dei post da una determinata categoria, se la categoria contiene dei post. Questo deve essere utilizzato in una pagina delle opzioni di un plugin.

Finora ho:

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

Ma sto avendo difficoltà su come ottenere un array contenente solo l'ID di ciascun post in quella categoria.

Qualche idea? Grazie

0
Tutte le risposte alla domanda 2
0
16

La cosa da ricordare riguardo get_posts è che utilizza internamente un oggetto WP_Query. Codice sorgente di get_posts:

<?php
/**
 * Recupera un elenco di post recenti o post che corrispondono ai criteri.
 *
 * I valori predefiniti sono i seguenti:
 *     'numberposts' - Il valore predefinito è 5. Numero totale di post da recuperare.
 *     'offset' - Il valore predefinito è 0. Vedi {@link WP_Query::query()} per maggiori informazioni.
 *     'category' - Da quale categoria recuperare i post.
 *     'orderby' - Il valore predefinito è 'post_date'. Come ordinare i post.
 *     'order' - Il valore predefinito è 'DESC'. L'ordine in cui recuperare i post.
 *     'include' - Vedi {@link WP_Query::query()} per maggiori informazioni.
 *     'exclude' - Vedi {@link WP_Query::query()} per maggiori informazioni.
 *     'meta_key' - Vedi {@link WP_Query::query()} per maggiori informazioni.
 *     'meta_value' - Vedi {@link WP_Query::query()} per maggiori informazioni.
 *     'post_type' - Il valore predefinito è 'post'. Può essere 'page', o 'attachment' per citarne alcuni.
 *     'post_parent' - Il genitore del post o del tipo di post.
 *     'post_status' - Il valore predefinito è 'publish'. Stato del post da recuperare.
 *
 * @since 1.2.0
 * @uses $wpdb
 * @uses WP_Query::query() Vedi per ulteriori argomenti predefiniti e informazioni.
 * @link http://codex.wordpress.org/Template_Tags/get_posts
 *
 * @param array $args Opzionale. Sostituisce i valori predefiniti.
 * @return array Elenco di post.
 */
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 il numero di post inclusi
        $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);

}

Il che significa, ovviamente, che puoi utilizzare gli stessi argomenti accettati da WP_Query. Questo include i parametri relativi ai campi.

Per ottenere un array di soli ID, dovresti fare qualcosa del genere:

<?php
$post_ids = get_posts(array(
    'numberposts'   => -1, // ottieni tutti i post.
    'tax_query'     => array(
        array(
            'taxonomy'  => 'category',
            'field'     => 'id',
            'terms'     => 5,
        ),
    ),
    'fields'        => 'ids', // Ottieni solo gli ID dei post
));

Oppure puoi racchiuderlo in una funzione per maggiore flessibilità.

<?php
function wpse71471_get_post_ids($cat, $taxonomy='category')
{
    return get_posts(array(
        'numberposts'   => -1, // ottieni tutti i post.
        'tax_query'     => array(
            array(
                'taxonomy'  => $taxonomy,
                'field'     => 'id',
                'terms'     => is_array($cat) ? $cat : array($cat),
            ),
        ),
        'fields'        => 'ids', // ottieni solo gli ID dei post.
    ));
}
4 nov 2012 03:30:04
2

Si prega di fare riferimento al seguente articolo: Ottenere gli ID dei post da WP_Query?

Dovresti utilizzare: wp_list_pluck

Esempio:

$ids = get_posts( array(
    'post_type' => 'contact',
    'pages_per_post' => -1,
) );

var_dump(wp_list_pluck( $ids, 'ID' ));
27 ott 2015 03:29:23
Commenti

Questo è ancora molto, molto costoso. Stai restituendo l'oggetto post completo per ogni articolo. Se hai più di 1000 articoli, la tua query potrebbe andare in timeout. La soluzione più semplice e migliore è impostare il parametro fields su ids, in questo modo verranno restituiti solo gli ID. Questo risparmia un'ENORME quantità di chiamate al database e tempo necessario per eseguire la query.

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

La risposta di @s_ha_dum dal post collegato è il modo corretto se vuoi solo gli ID degli articoli.

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