Zapytanie dotyczące niestandardowego typu postu? [Zamknięte]

16

Zainstalowałem wtyczkę interfejsu użytkownika typu niestandardowego . Po aktywacji tej wtyczki utworzyłem niestandardowy typ postu o nazwie portfolio. Teraz chcę użyć tego na stronie portfolio w interfejsie. Jak pobrać wszystkie posty niestandardowego typuportfolio ?

shalu
źródło

Odpowiedzi:

22
query_posts( array( 'post_type' => array('post', 'portfolio') ) );

który pokazuje zarówno zwykłe posty, jak i posty wewnątrz portfoliotypu

lub

query_posts('post_type=portfolio');

dla tylko portfolio.

Użyj jako zwykłego zapytania WP - przeczytaj Kodeks: 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;?>
Martin-Al
źródło
6
To dość stara odpowiedź - ale, aby być jasnym, nie ma sposobu, abyś to robił. Prawie nieuchronnie doprowadzi to do 404 i wielu innych problemów. Zobacz odpowiedzi @ kaiser lub ten post, dlaczego nie powinieneś używaćquery_posts()
Stephen Harris
16

Późna odpowiedź jako główna odpowiedź query_posts(), której nigdy nie należy robić.

Użyj filtra

Użyj pre_get_postsfiltru i po prostu ustaw portfoliotyp postu dla głównego zapytania. Użyj tagów warunkowych, aby określić, gdzie chcesz mieć ten filtr.

Szybki przykład

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

add_filter( 'pre_get_posts', 'wpse_6417_portfolio_posts' );
function wpse_6417_portfolio_posts( $query )
{
    if (
        ! $query->is_main_query()
        // Here we can check for all Conditional Tags
        OR ! $query->is_archive() // For e.g.: Every archive will feature both post types
    )
        return $query;

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

    return $query;
}

Zrzeczenie się

Powyższy kod jest wtyczką, ale można go po prostu umieścić w functions.phppliku motywu (co nie jest zalecane).

kajzer
źródło
dlaczego nie zaleca się dodawania go do funkcji? Z pewnością, jeśli administrator witryny zmieni motyw, musieliby się zastanowić, jak wyświetlić portfolio na stronie głównej z tym nowym motywem. Powiedziałbym więc, że równie dobrze jest dodać to w funkcjach, a nie we wtyczce. A może coś mi brakuje?
Phill Healey
@PhillHealey Jak już powiedziałeś, dane będą niewidoczne i będziesz musiał skopiować i wkleić kod. Ciężkie, logiczne modyfikacje zapytań najlepiej obsługiwać za pomocą wtyczek, a wyświetlanie i styl powinny być przechowywane w motywach.
Kaiser
Nie, jeśli ten kod jest specyficzny dla motywu.
Phill Healey,
@PhillHealey Typ wpisu nigdy nie powinien być specyficzny dla motywu.
kaiser
Ok, jeśli chcesz wpakować się w absolutne absolutnie, to w porządku. Jednak nie można powiedzieć, że żaden kod specyficzny dla projektu nie powinien być wypychany do wtyczki. Wiele razy jest to nieodpowiednie.
Phill Healey,
4

Dodaj ten kod do pliku funkcji motywów potomnych (zalecane), aby dodać pojedyncze strony CPT do głównej pętli

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;

}

Źródło http://codex.wordpress.org/Post_Types

Lub utwórz niestandardowy szablon strony archive-portfolio.php którym będą wyświetlane tylko strony CPT. Tę czynność należy wykonać tylko wtedy, gdy nie dodano strony archiwum przy użyciu ustawień wtyczki.

Przykład: „has_archive” => true,

Za pomocą tego kodu możesz również kontrolować liczbę wyświetlanych stron i kolejność ich wyświetlania na stronie archiwum:

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

    }

}
Brad Dalton
źródło