Query per custom post type?
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
?

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;?>

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()

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).

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?

@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.

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

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' );
}
}
