Frage nach benutzerdefiniertem Beitragstyp? [geschlossen]

16

Ich habe das Custom Post Type UI-Plugin installiert . Nach der Aktivierung dieses Plugins habe ich einen benutzerdefinierten Beitragstyp namens erstellt portfolio. Jetzt möchte ich dies auf der Portfolio-Seite im Frontend verwenden. Wie rufe ich alle Posts ab, die einen benutzerdefinierten Post-Typ habenportfolio ?

Shalu
quelle

Antworten:

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

Das zeigt sowohl normale Beiträge als auch Beiträge innerhalb des portfolioTyps

oder

query_posts('post_type=portfolio');

nur für portfolio.

Als normale WP-Abfrage verwenden - Lesen Sie den Codex: http://codex.wordpress.org/Function_Reference/query_posts#Usage und 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
quelle
6
Dies ist eine ziemlich alte Antwort - aber um klar zu sein, es gibt nicht die Art und Weise, wie Sie dies tun sollten. Es wird fast zwangsläufig zu 404s und vielen anderen Problemen führen. Bitte siehe @ kaisers Antworten oder diesen Beitrag, warum Sie nicht verwenden solltenquery_posts()
Stephen Harris
16

Eine späte Antwort wird als Hauptantwort verwendet query_posts(), was niemals getan werden sollte.

Verwenden Sie einen Filter

Verwenden Sie den pre_get_postsFilter und legen Sie einfach den portfolioBeitragstyp für die Hauptabfrage fest. Verwenden Sie bedingte Tags , um zu bestimmen, wo Sie diesen Filter haben möchten.

Schnelles Beispiel

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

Haftungsausschluss

Der obige Code ist ein Plugin, kann aber einfach in das gestopft werden functions.php Datei Ihres Themas eingefügt werden (was nicht empfohlen wird).

Kaiser
quelle
Warum wird es nicht empfohlen, es zu Funktionen hinzuzufügen? Wenn der Site-Administrator das Thema ändert, muss er auf jeden Fall festlegen, wie das Portfolio auf der Startseite mit diesem neuen Thema angezeigt werden soll. Daher würde ich sagen, dass es genauso gültig ist, dies in Funktionen und nicht in einem Plugin hinzuzufügen. Oder vermisse ich etwas?
Phill Healey
@PhillHealey Wie Sie sagten, wären die Daten unsichtbar und Sie müssten den Code kopieren und einfügen. Schwerwiegende, logische Änderungen an Abfragen werden am besten über Plugins bereitgestellt, während das Anzeigen und Stylen in Themen beibehalten werden sollte.
Kaiser
Nicht, wenn dieser Code für das Thema spezifisch ist.
Phill Healey
@PhillHealey Ein Beitragstyp sollte niemals themenspezifisch sein.
Kaiser
Ok, wenn Sie ein bisschen mehr wollen, als Sie wollen, dann ist das in Ordnung. Es ist jedoch nicht richtig zu sagen, dass kein designspezifischer Code an ein Plugin übertragen werden sollte. Es gibt viele Male, in denen das nicht angemessen ist.
Phill Healey
4

Fügen Sie diesen Code zu Ihrer Funktionsdatei für untergeordnete Themen hinzu (empfohlen), um Ihre einzelnen CPT-Seiten zu Ihrer Hauptschleife hinzuzufügen

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;

}

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

Oder erstellen Sie eine benutzerdefinierte Seitenvorlage archive-portfolio.php, die nur Ihre CPT-Seiten anzeigt. Dies muss nur durchgeführt werden, wenn Sie über die Plugin-Einstellungen keine Archivseite hinzugefügt haben.

Beispiel: 'has_archive' => true,

Mit diesem Code können Sie auch steuern, wie viele Seiten angezeigt werden und in welcher Reihenfolge sie auf der Archivseite angezeigt werden:

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
quelle