Interogare pentru tipuri de postări personalizate?
Am instalat pluginul Custom Post Type UI. După activarea acestui plugin am creat un tip de postare personalizat numit portfolio
. Acum vreau să-l folosesc pe pagina de portfolio în frontend. Cum pot să preiau toate postările care sunt de tipul personalizat portfolio
?

query_posts( array( 'post_type' => array('post', 'portfolio') ) );
care afișează atât postări normale cât și postări din tipul portfolio
sau
query_posts('post_type=portfolio');
doar pentru portfolio
.
Folosește ca o interogare WP normală - citește Codex-ul: http://codex.wordpress.org/Function_Reference/query_posts#Usage și 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;?>

Acesta este un răspuns destul de vechi - dar pentru a fi clar, nu este modul în care ar trebui să procedați. Acest lucru va duce aproape inevitabil la erori 404 și o serie de alte probleme. Vă rugăm să consultați răspunsurile lui @kaiser sau acest articol despre de ce nu ar trebui să folosiți query_posts()

Răspuns întârziat deoarece răspunsul principal folosește query_posts()
, ceea ce nu ar trebui făcut niciodată.
Folosește un filtru
Folosește filtrul pre_get_posts
și setează pur și simplu tipul de postare portfolio
pentru interogarea principală. Folosește Etichete Condiționale pentru a determina unde dorești să aplici acest filtru.
Exemplu Rapid
<?php
defined( 'ABSPATH' ) OR exit;
/* Plugin Name: (#6417) Tipul de postare "Portfolio" în interogare */
add_filter( 'pre_get_posts', 'wpse_6417_portfolio_posts' );
function wpse_6417_portfolio_posts( $query )
{
if (
! $query->is_main_query()
// Aici putem verifica toate Etichetele Condiționale
OR ! $query->is_archive() // De exemplu: Fiecare arhivă va include ambele tipuri de postări
)
return $query;
$query->set( 'post_type', array( 'post', 'portfolio' ) );
return $query;
}
Notă importantă
Codul de mai sus este un plugin, dar poate fi plasat simplu în fișierul functions.php
al temei tale (lucru care nu este recomandat).

de ce nu este recomandat să-l adăugați în functions? Sigur, dacă administratorul site-ului schimbă tema, ar trebui să se ocupe de modul în care să afișeze portofoliul pe pagina principală cu această nouă temă oricum. Așadar, aș spune că este la fel de valid să adăugați acest lucru în functions decât într-un plugin. Sau omit ceva?

@PhillHealey După cum ai spus, datele ar fi invizibile și ar trebui să copiezi și să lipești codul în jur. Modificările majore ale logicii interogărilor sunt mai bine gestionate prin plugin-uri, în timp ce afișarea și stilizarea ar trebui păstrate în teme.

@PhillHealey Un tip de postare nu ar trebui niciodată să fie specific unui temă.

Adaugă acest cod în fișierul functions al temei child (recomandat) pentru a adăuga paginile tale CPT în loop-ul principal
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;
}
Sursă http://codex.wordpress.org/Post_Types
Sau creează un șablon de pagină archive-portfolio.php personalizat care va afișa doar paginile tale CPT. Acest lucru trebuie făcut doar dacă nu ai adăugat o pagină de arhivă folosind setările pluginului.
Exemplu: 'has_archive' => true,
De asemenea, poți controla câte pagini sunt afișate și ordinea în care sunt afișate pe pagina de arhivă folosind acest cod:
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' );
}
}
