Support » Themes » Loop: Custom Post Types UND Beiträge einer bestimmten Kategorie anzeigen

  • Hi,

    ich habe neben den normalen Beiträgen noch ein Custom Post Type (aus Gründen). Jetzt möchte ich auf einer Seite alle Beiträge mit einer bestimmten Kategorie (‚jobangebote‘) UND alle Custom Post Types (die ebenfalls dieser Kategorie zugeordnet sind) anzeigen lassen. Mein Ansatz

    <?php $paged = (get_query_var('jobangebote')) ? get_query_var('jobangebote') : 1; query_posts(array(
    	'post_type' => 'jobs', // custom post type
    	'paged'=>$paged,
    	));
    ?>
    <?php while ( have_posts() ) : the_post(); ?>
    [...]

    gibt lediglich die Custom Post Types aus. Alle meine Versuche, die Abfrage entsprechend zu erweitern waren erfolglos. Wie gehts richtig?

    Danke, cheers,
    Uli

Ansicht von 4 Antworten - 1 bis 4 (von insgesamt 4)
  • Ich würde gerne anders anfangen, als du es dir vermutlich erhofft hast und aus einem anderen Beitrag zitieren:

    Die Verwendung von query_posts() ist fast immer falsch. Diese Funktion ist eigentlich gar nicht für die Verwendung von Plugins und Themes gedacht, weil es performantere Möglichkeiten gibt, an die gewünschten Inhalte zu kommen.

    WordPress verwendet zur Darstellung von Inhalten eine eigene Hierarchie bei der Auswahl der Templates. Dazu ruft es, wenn eine Webseite angefordert wird, zunächst Daten aus der Datenbank ab, erstellt daraus ein Objekt und schaut dann, welches Template zur Darstellung optimal geeignet wäre. Ist dieses Template nicht vorhanden, fällt es auf das am besten geeignete Template zurück (bis zum Schluss nur noch das Template index.php übrig bleibt).

    Wenn du nun query_posts() verwendest, ist all diese Mühe umsonst gewesen, da du erneut Daten abrufst und erneut ein Objekt erstellt werden muss.

    Besser wäre es, wenn du mit einer Funktion WordPress vor der Abfrage mitteilst, was du anders ausgegeben haben möchtest. Mit dieser Funktion in der functions.php deines Child-Themes (besser: in einem Plugin) gibst du auf der Kategorie-Seite Zur Kategorie „Jobs“ zusätzlich den Custom Post Type aus:

    add_filter( 'pre_get_posts', 'my_get_posts' );
    
    function my_get_posts( $query ) {
    
    //Aus der Seite Jobangebote Beitragsart Jobs und reguläre Beiträge ausgeben
      if ( is_category('jobs') && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'post', 'jobs' ) );
      }
      return $query;
    }

    Nachtrag: Ich sehe gerade, dass dieser Ansatz leider nur bedingt weiterführt, da auch nur Custom Post Type Posts in der Kategorie „jobs“ angezeigt würden. Statt dessen müsste eine Funktion dem Filter ‚post_where‘ zugewiesen werden, was hier im Moment etwas den Rahmen meiner Möglichkeiten sprengt. Ich schaue mir die Fragestellung aber nochmal an – vielleicht kann ich dann noch eine weitere Lösung beisteuern.

    Thread-Ersteller DerHerrMeier

    (@derherrmeier)

    Hi Bego,
    vielen Dank für dein Antwort. Mittlerweile habe ich auch gesehen, dass quer_posts nicht benutzen sollte. Laut Function Reference ist die Alternative pre_get_posts (It is strongly recommended that you use the pre_get_posts filter instead). Hier steht allerdings weiter unten: „Note: The pre_get_posts action doesn’t work for Page requests.„. Ich möchte das Ganze allerdings auf einer Seite ausgeben. Mit query_posts funktioniert das; ich würde aber doch gerne best practice üben.

    Danke, Uli

    Soweit waren wir ja schon:

    • query_posts() sollte nicht verwendet werden
    • statt dessen pre_get_posts-Filter verwenden.
    • Dass die Beiträge dann auf einer Webseite ausgegeben werden, macht keinen Unterschied.

    Das Problem ist nun aber, dass du im Prinzip zwei unterschiedliche Dinge mischen möchtest: Beiträge ausschließlich in der Kategorie „Jobs“ UND benutzerdefinierte Beiträge jeder Kategorie. Du kannst in einem pre_get_post-Filter zwar angeben, dass du zusätzlich eine Beitragsart „Jobs“ abrufen möchtest ($query->set( 'post_type', array( 'post', 'jobs' ) );) aber auf Grund der Vorgabe is_category(‚jobs‘) werden (egal von welcher Beitragsart) nur Beiträge der Kategorie „Jobs“ ausgegeben.

    Die Lösung ist wie gesagt, den Filter posts_where zu verwenden. Das ist aber etwas kniffeliger und geht hier im Moment über meine Kapazitäten hinaus. Aber wenn du jemand findest, der sich der Sache annimmt …

    PS: Ich sehe gerade, dass du geschrieben hast

    alle Custom Post Types (die ebenfalls dieser Kategorie zugeordnet sind)

    Wenn die benutzerdefinierten Beiträge tatsächlich bereits in der Kategorie „jobs“ sind, sollte die beschriebene Lösung mit pre_get_posts ausreichen.

    Thread-Ersteller DerHerrMeier

    (@derherrmeier)

    Ja genau, die benutzerdefinierten Beiträge sind bereits in der Kategorie „jobs“. Ich probier´s aus, vielen Dank schon mal.

Ansicht von 4 Antworten - 1 bis 4 (von insgesamt 4)
  • Das Thema „Loop: Custom Post Types UND Beiträge einer bestimmten Kategorie anzeigen“ ist für neue Antworten geschlossen.