Support » Allgemeine Fragen » Einen einzelnen Custom-Post-Type-Beitrag in den Blog einbinden

  • Gelöst sunrises

    (@sunrises)


    Ich habe einen WordPress-Blog mit gewöhnlichen Beiträgen auf der Startseite meiner Website. Aber ich habe auch einen benutzerdefinierten Beitragstyp namens „buildings_post_type“. Und ich möchte, dass die zweit- und drittjüngsten veröffentlichten Beiträge von diesem Typ an zweiter und dritter Stelle im Blog erscheinen.

    Mit dem folgenden Code kann ich einen bestimmten gewöhnlichen Beitrag (mit der ID 33) an dritter Stelle in den Blog integrieren. Aber das hilft mir noch nicht weiter.

    function insert_post_wpse_33($posts) {
      global $wp_query;
      $desired_post = 33;
      if (is_main_query() && is_home() &&  0 == get_query_var('paged')) {
        $p2insert = new WP_Query(array('p'=>$desired_post,'suppress_filters'=>true));
        $insert_at = 3;
        if (!empty($p2insert->posts)) {
          array_splice($posts,$insert_at,0,$p2insert->posts);
        }
      }
      return $posts;
    }
    add_filter('posts_results','insert_post_wpse_33', 45);

    Der folgende Code wiederum würde einfach nur den letzten Beitrag verschiedener Custom Post Types integrieren:

    query_posts( array(
     'post_type' => array( 'custom_post1', 'custom_post2', 'custom_post3', 
     'custom_post4' ),
     'cat' => 3,
     'showposts' => 5 )
     );

    Wüsste aber jemand, wie der Code sein müsste, den ich in den functions.php einbinden muss, um mein eingangs beschriebenes Ziel zu erreichen?

    • Dieses Thema wurde geändert vor 1 Monat von sunrises.
Ansicht von 6 Antworten - 1 bis 6 (von insgesamt 6)
  • threadi

    (@threadi)

    Die größte Herausforderung bei deinem Wunsch ist ist die Datenbankabfrage. Aber das ist lösbar. Hier ein einfaches Beispiel:

    $query = array(
                'post_type' => 'buildings_post_type',
                'orderby'   => array(
                    'date' =>'DESC',
                    'menu_order'=>'ASC'
                ),
                'posts_per_page'    => 2,
                'suppress_filters'=>true
            );
            $result = new WP_Query( $query );

    In deinen PHP-Code eingebunden könnte das so aussehen (ungetestet):

    function insert_post_wpse_33($posts) {
        if (is_main_query() && is_home() &&  0 == get_query_var('paged')) {
            $query = array(
                'post_type' => 'buildings_post_type',
                'orderby'   => array(
                    'date' =>'DESC',
                    'menu_order'=>'ASC'
                ),
                'posts_per_page'    => 2,
                'suppress_filters'=>true
            );
            $result = new WP_Query( $query );
            if (!empty($result->posts)) {
                array_splice($posts,2,0,$result->posts);
            }
        }
        return $posts;
    }
    add_filter('posts_results','insert_post_wpse_33', 45);
    Thread-Starter sunrises

    (@sunrises)

    Vielen, vielen Dank. Das funktioniert auf Anhieb wie gewünscht. Eine Überraschung gibt es aber: Die zwei Custom Posts erscheinen nicht nur auf der Startseite, sondern zusätzlich in der Menüleiste. Allerdings nur, wenn man die Startseite aufruft. Wenn man auf einer Unterseite ist, erscheint die Menüleiste ganz normal. Wie könnte ich das noch beheben?

    Das kann ich schwer beurteilen da es abhängig vom Theme ist, welches das Menü aufbaut. In der Funktion wird die Ausführung ja bereits auf is_home() und is_main_query() beschränkt. Mir ist unklar wie man es noch so einschränken könnte, dass es auch bei deinem Menü nicht greift. Schau dir an wie das Menü erzeugt wird, ggfs. gibt es dort irgendeine Eigenschaft die man dafür verwenden könnte.

    Thread-Starter sunrises

    (@sunrises)

    Ah, es lässt sich ganz einfach lösen, wenn man unter Design > Menü ein eigenes Menü erstellt.

    Noch eine Frage ist mir eingefallen: Kann man auch einstellen, dass der jüngste Custom Post übersprungen wird, also nur der zweit- und drittälteste Beitrag eingebunden wird?

    Moderator Bego Mario Garde

    (@pixolin)

    Dazu kannst du der Abfrage ein weiteres Argument offset übermitteln. Also sowas wie …

    $query = array(
    'post_type' => 'buildings_post_type',
    'orderby' => array(
    'date' =>'DESC',
    'menu_order'=>'ASC'
    ),
    'posts_per_page' => 2,
    'offset' => 1,
    'suppress_filters'=>true
    );
    Thread-Starter sunrises

    (@sunrises)

    Vielen Dank!

Ansicht von 6 Antworten - 1 bis 6 (von insgesamt 6)