Query per custom post type?

6 gen 2011, 12:14:22
Visualizzazioni: 174K
Voti: 18

Ho installato il plugin Custom Post Type UI. Dopo l'attivazione di questo plugin ho creato un custom post type chiamato portfolio. Ora voglio utilizzarlo nella pagina portfolio nel front-end. Come posso recuperare tutti i post che appartengono al custom post type portfolio?

0
Tutte le risposte alla domanda 3
1
24
query_posts( array( 'post_type' => array('post', 'portfolio') ) );

che mostra sia i post normali che i post del tipo portfolio

oppure

query_posts('post_type=portfolio');

per mostrare solo i post di tipo portfolio.

Usa come una normale WP Query - leggi il Codex: http://codex.wordpress.org/Function_Reference/query_posts#Usage e http://codex.wordpress.org/Function_Reference/query_posts#Post_.26_Page_Parameters

<?php 
    query_posts(array( 
        'post_type' => 'portfolio',
        'showposts' => 10 
    ) );  
?>
<?php while (have_posts()) : the_post(); ?>
        <h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
        <p><?php echo get_the_excerpt(); ?></p>
<?php endwhile;?>
6 gen 2011 12:33:02
Commenti

Questa è una risposta piuttosto vecchia - ma per essere chiari, non è il modo in cui dovresti fare questa cosa. Quasi inevitabilmente porterà a errori 404 e a una serie di altri problemi. Per favore consulta le risposte di @kaiser o questo post sul perché non dovresti usare query_posts()

Stephen Harris Stephen Harris
28 mag 2013 16:24:26
5
18

Risposta tardiva poiché la risposta principale utilizza query_posts(), che non dovrebbe mai essere usato.

Utilizza un filtro

Utilizza il filtro pre_get_posts e imposta semplicemente il post type portfolio per la query principale. Usa i Tag Condizionali per determinare dove vuoi applicare questo filtro.

Esempio rapido

<?php
defined( 'ABSPATH' ) OR exit;
/* Plugin Name: (#6417) Post type "Portfolio" nella query */

add_filter( 'pre_get_posts', 'wpse_6417_portfolio_posts' );
function wpse_6417_portfolio_posts( $query )
{
    if (
        ! $query->is_main_query()
        // Qui possiamo verificare tutti i Tag Condizionali
        OR ! $query->is_archive() // Ad esempio: Ogni archivio includerà entrambi i post type
    )
        return $query;

    $query->set( 'post_type', array( 'post', 'portfolio' ) );

    return $query;
}

Avvertenza

Il codice sopra è un plugin, ma può essere semplicemente inserito nel file functions.php del tuo tema (cosa che non è raccomandata).

27 mag 2013 16:42:29
Commenti

Perché non è consigliato aggiungerlo alle funzioni? Sicuramente, se l'amministratore del sito cambia il tema, dovrebbe comunque affrontare il problema di come visualizzare il portfolio nella home page con questo nuovo tema. Quindi, direi che è altrettanto valido aggiungere questo nelle funzioni piuttosto che in un plugin. O mi sfugge qualcosa?

Phill Healey Phill Healey
29 nov 2016 22:21:32

@PhillHealey Come hai detto, i dati sarebbero invisibili e dovresti copiare e incollare il codice in giro. Modifiche pesanti alla logica delle query sono meglio gestite tramite plugin, mentre la visualizzazione e lo stile dovrebbero essere mantenuti nei temi.

kaiser kaiser
29 nov 2016 22:45:33

Non se quel codice è specifico per il tema.

Phill Healey Phill Healey
3 dic 2016 23:27:00

@PhillHealey Un tipo di post non dovrebbe mai essere specifico per un tema.

kaiser kaiser
4 dic 2016 20:33:06

Ok, se vuoi discutere di assoluti allora va bene. Però non è corretto affermare che il codice non specifico al design debba sempre essere spostato in un plugin. Ci sono molte situazioni in cui questo non è appropriato.

Phill Healey Phill Healey
5 dic 2016 20:23:49
0

Aggiungi questo codice al file functions del tuo child theme (consigliato) per includere le pagine del tuo CPT nel loop principale

add_action( 'pre_get_posts', 'add_custom_post_types_to_loop' );

function add_custom_post_types_to_loop( $query ) {

if ( is_home() && $query->is_main_query() )

$query->set( 'post_type', array( 'post', 'portfolio' ) );

return $query;

}

Fonte http://codex.wordpress.org/Post_Types

Oppure crea un template personalizzato archive-portfolio.php che mostrerà solo le pagine del tuo CPT. Questo è necessario solo se non hai aggiunto una pagina di archivio tramite le impostazioni del plugin.

Esempio: 'has_archive' => true,

Puoi anche controllare quanti elementi mostrare e l'ordine in cui vengono visualizzati nella pagina di archivio con questo codice:

add_action( 'pre_get_posts', 'cpt_items' );

function cpt_items( $query ) {

if( $query->is_main_query() && !is_admin() && is_post_type_archive( 'portfolio' ) ) {

$query->set( 'posts_per_page', '8' );

$query->set( 'order', 'ASC' );

    }

}
11 dic 2013 02:02:08