Support » Themes » querry posts parent and child

  • Gelöst potthe

    (@potthe)


    Sehr geehrte Community,

    ich bräuchte unbedingt Hilfe. Ich habe natürlich bereits versucht diese Topic zu finden, allerdings ohne Erfolg.

    Ich versuche ein One Page Layout zu basteln.
    habe dafür auch bereits folgenden Seitenaufbau:

    <?php query_posts('post_type=page&order=ASC&orderby=header_menu'); ?>
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
        <div class="mainPage">
            <h1 id="title_<?php the_ID(); ?>"><?php the_title(); ?></h1>
            <?php the_content(); ?>
        </div>
    <?php endwhile; endif; ?>

    Allerdings würde ich gerne, dass die Childpages direkt unter den Parents aufgelistet werden, wie ich euch hier aufgezeichnet habe.

    dH doof gesagt Parent Pages 100% width und wenn sie eine Childpage haben, die direkt drunter in 50% width.

    Ich würde mich sehr über eine Hilfe freuen.
    potthe

Ansicht von 14 Antworten - 1 bis 14 (von insgesamt 14)
  • Starten wir damit, dass du query_posts nicht mehr benutzt, sondern WP_Query:
    https://wordpress.stackexchange.com/questions/50761/when-to-use-wp-query-query-posts-and-pre-get-posts

    Danach sollte es mit einer Überprüfung auf Childs relativ einfach möglich sein. Was machst du bei einer ungeraden Anzahl von Kind-Elementen in deinem Layout?

    Gruß, Torsten

    Thread-Starter potthe

    (@potthe)

    Puh ähm Danke 🙂 , ich versuche gerade erfolglos das auf wp_querry um zu stellen.. -.-

    zu den Childs:
    ich hatte mir das so gedacht, dass ich sie einfach hintereinander weg legen werde, mittels css: display-flex. würde dann in etwa so aussehen

    Danke, potthe

    Thread-Starter potthe

    (@potthe)

    Sorry für den vorrigen, überschnellen Kommentar (..erfolglos..) -.-
    Okay, nun konnte ich das schon einmal auf wp_query umstellen (Danke für den Hinweis!)

    <?php $ptth_query = new WP_Query('post_type=page&order=ASC&orderby=header_menu');
        while($ptth_query->have_posts()) : $ptth_query->the_post(); ?>
            <div class="mainPage">
                <div <?php post_class(); ?> id="title_<?php the_ID(); ?>">
                    <h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
                    <?php the_content(); ?>
                </div>
            </div>
        <?php endwhile; ?>
    <?php wp_reset_postdata(); ?>

    Wie kann ich dem nun noch das Anliegen mit den Childs hinzufügen?

    Danke, potthe

    • Diese Antwort wurde geändert vor 6 Jahren, 5 Monaten von potthe.

    header_menu ist keine gültige Eigenschaft für das Attribut order_by. Probier mal menu_order. (vgl. https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters)

    Thread-Starter potthe

    (@potthe)

    ja ich hatte da ein wenig herumprobiert. Aktuell sieht der Code wie folgt aus:

    <?php $ptth_query = new WP_Query('post_type=page&order=ASC&orderby=menu_order');
        while($ptth_query->have_posts()) : $ptth_query->the_post(); ?>
            <div class="mainPage">
                <div <?php post_class(); ?> id="title_<?php the_ID(); ?>">
                    <h1><?php the_title(); ?></h1>
                    <?php the_content(); ?>
                </div>
            </div>
        <?php endwhile; ?>
    <?php wp_reset_postdata(); ?>

    Meine Problematik steckt auch eher dadrin, das Layout wie gewünscht hinzubekommen, dH wenn ein Parent Element ein Child Element hat, das dieses direkt dadrunter in 50% width angezeigt wird. Auch sollte es eine ungerade Anzahl an Childs sein, sollten diese einfach hintereinander gelegt werden, sodass sie sich einreihen (floaten, oder flex box).

    Danach sollte es mit einer Überprüfung auf Childs relativ einfach möglich sein.

    Wie stell ich das an?

    Ich brauch echt Hilfe, danke.
    potthe

    Überprüfung auf Childs:
    https://wordpress.stackexchange.com/questions/35724/function-to-return-true-if-current-page-has-child-pages

    Die Frage enthält auch eine Abfrage zu is_subpage, die du zusätzlich nutzen kannst, um Unterseiten auszuschließen, so dass du keine Dopplungen hast.

    Für eine ausführlichere Lösung habe ich leider gerade keine Zeit. Aber vielleicht kommst du oder jemand anders mit diesem Start schon weiter …

    Gruß, Torsten

    Thread-Starter potthe

    (@potthe)

    Ich danke dir, für deine Hilfe trotz deines eigenen strengen Terminkalenders.
    Ich habe es ein wenig ausprobiert, weiss aber nicht ob dies die Sicherste und Ressourcen optimierteste Version ist -.- //scheint aber zu funktionieren..
    Mag da vllt nochmals jemand rüber gucken und mir sagen obs passt, oder nicht..!? Wäre sehr nett, danke.

    Aktuell floate ich die Subpages, aber dieses Verfahren möchte ich noch mit flex box realisieren.

    <?php $ptth_query = new WP_Query('post_type=page&order=ASC&orderby=menu_order&post_parent=0');
        while($ptth_query->have_posts()) : $ptth_query->the_post(); ?>
            <div class="mainPage">
                <div <?php post_class(); ?> id="title_<?php the_ID(); ?>"></div>
                <h1><?php the_title(); ?></h1>
                <?php the_content(); ?>
                <!-- ptth_SubPages -->
                <?php $ptth_subpages = get_pages( array( 'child_of' => $post->ID, 'sort_column' => 'menu_order', 'sort_order' => 'asc' ) );
                    foreach( $ptth_subpages as $page ) {		
                        $content = $page->post_content;
                        if ( ! $content )
                            continue;
                        $content = apply_filters( 'the_content', $content );
                    ?>
                    <div class="subPage">
                        <h2><a href="<?php echo get_page_link( $page->ID ); ?>"><?php echo $page->post_title; ?></a></h2>
                        <?php echo $content; ?>
                    </div>
                    <?php
                    }	
                ?>
            </div>
        <?php endwhile; ?>
    <?php wp_reset_postdata(); ?>

    Danke für eure Hilfe, potthe.

    • Diese Antwort wurde geändert vor 6 Jahren, 5 Monaten von potthe.
    Thread-Starter potthe

    (@potthe)

    Hm, Moin Moin again 🙂
    Ich benötige echt Hilfe und ja ich bin nicht der Einzige 😀
    Doof gesagt, will ich gar keine Arbeitsabnahme, Anstöße reichen mir schon!

    Folgender Code:

    <?php $ptth_query = new WP_Query('post_type=page&order=ASC&orderby=menu_order&post_parent=0');
        while($ptth_query->have_posts()) : $ptth_query->the_post(); ?>
            <div  id="mainPage_<?php the_ID(); ?>" class="mainPage">
                <div <?php post_class(); ?> id="title_<?php the_ID(); ?>"></div>
                            <h1><?php the_title(); ?></h1>
                            <?php the_content(); ?>
                            <?php global $post; dynamic_sidebar( 'pttheme_content_sidebar_'.$post->post_name ); ?>
                <!-- ptth_SubPages -->
                <?php $ptth_subpages = get_pages( array( 'child_of' => $post->ID, 'sort_column' => 'menu_order', 'sort_order' => 'asc' ) );
                    foreach( $ptth_subpages as $page ) {		
                        $content = $page->post_content;
                        if ( ! $content )
                            continue;
                        $content = apply_filters( 'the_content', $content );
                    ?>
                    <div class="subPage">
                        <div <?php post_class(); ?> id="subtitle_<?php the_ID(); ?>"></div>
                        <h2><a href="<?php echo get_page_link( $page->ID ); ?>"><?php echo $page->post_title; ?></a></h2>
                        <?php echo $content; ?>
                    </div>
                    <?php
                    }	
                ?>
            </div><hr class="page_hr" />
        <?php endwhile; ?>
    <?php wp_reset_postdata(); ?>

    Folgendes !wichtiges! Anliegen:
    Ich würde nun gerne, dass wenn eine Page die Beitragsseite ist, dass natürlich auch die Beiträge dann angezeigt werden.

    Letztere (eher unwichtigere) Anliegen:
    ich habe bereits dem Content und der Sidebar ids gegeben, damit ich sie einzelnd ansprechen kann. Via der functions.php habe ich dann versucht zu sagen, dass wenn eine page eine sidebar aktiviert hat, dass der content (ich sag mal) width: 80%; und die sidebar dann width: 20%; ist. ich habe versucht das via js mit documentgetelemetbyid oder per php if(..) + css display: block/ none und wieder einbinden. Alles nicht geklappt.

    Ich weiss es gibt immer wichtigeres, aber ich würde mich wirklich sehr über eine Hilfe freuen.! (Wer nicht..)
    In diesem Sinne, wünsche ich ein wunderschönes Wochenende.

    Peace, potthe

    Thread-Starter potthe

    (@potthe)

    Okay, anscheinend dumme Frage gewesen,…
    also ich gucke gerade, wie ich einen UND Operator einbinden kann, weil aktuell wird mir immer der hintere Wert angezeigt,
    entweder: post type > page
    hier: post type > post

    <?php $ptth_query = new WP_Query(array('post_type' => 'page','post_type' => 'post','order' => 'ASC','orderby' => 'menu_order','post_parent' => 0) );

    Sorry und thanks 4 help..

    • Diese Antwort wurde geändert vor 6 Jahren, 5 Monaten von potthe.
    • Diese Antwort wurde geändert vor 6 Jahren, 5 Monaten von potthe.

    Erstell mal eine Seite „Versuch“ und füge in deinem Child Theme ein neues Template page-versuch.php mit folgendem Inhalt hinzu:

    <?php
    get_header();
    $args = array(
    	'post_type' => 'page',
    	'post_parent' => '0',
    );
    $query = new WP_query( $args );
    
    while ( $query->have_posts() ) :
    
    	$query->the_post();
    
    	echo $post->ID . ':' . get_the_title() . '<br>';
    
    	// get their children
    	$children = get_children(
    		array(
    			'post_type' => 'page',
    			'post_parent' => $post->ID,
    		)
    	);
    	foreach ( $children as $child ) {
    		echo '&nbsp;&nbsp;' . $child->post_title . '<br>';
    	}
    	// if posts page, get posts
    	if ( get_option( 'page_for_posts' ) == $post->ID ) {
    		$blog_posts = fetch_my_posts();
    		foreach ( $blog_posts as $single_post ) {
    			echo '&nbsp;&nbsp;' . $single_post->post_title . '<br>';
    		}
    	}
    endwhile;
    
    function fetch_my_posts() {
    		$args = array(
    			'post_type'        => 'post',
    			'post_status'      => 'publish',
    		);
    		return get_posts( $args );
    }
    
    wp_reset_postdata();
    get_footer();

    Im Ergebnis solltest du auf der Seite „Versuch“ eine Auflistung der Seiten- und Beitragstitel sehen, die sinngemäß so aussieht:

    Startseite (statische Startseite)
    Unser Abteilungen
    -Abteilung 1 (Unterseite)
    -Abteilung 2 (Unterseite)
    Über uns
    Blog (Blog-Seite)
    -Beitrags-Titel 1
    -Beitrags-Titel 2
    -Beitrags-Titel 3
    Impressum

    Damit werden

    1. Alle Seiten aufgeführt, die nicht Unterseite sind
    2. Unterseiten, wenn sie zu einer unter 1 aufgeführten Seite gehören
    3. Blogbeiträge, wenn die unter 1 aufgeführte Seite die Blogseite ist.

    Ich habe bei dem Code-Beispiel erst einmal alle zusätzlichen Argumente und <div>-Tags rausgemschmissen, damit man überhaupt erstmal durchblickt. Das kannst du dann später wieder hinzufügen. Aus den gleichen Gründen habe ich auch nur die Titel und nicht den Inhalt ausgegeben.

    Was die Aufteilung mit/ohne Sidebar angeht, würde ich unterschiedliche Seiten-Templates „volle Breite“ und „ohne Sidebar“ nehmen und dann in diesen Templates dem Inhaltsbereich eine entsprechende CSS-Klasse geben (.full bzw .with-sidebar).

    Thread-Starter potthe

    (@potthe)

    Ou yeah man! Ich danke dir von Herzen!!, jetzt nur noch die Contents ausbringen ist ease!!

    Peace, potthe

    Besser wäre es, für den Abruf der Unterseiten und Blogbeiträge jeweils einzelne Funktionen zu schreiben. Im Moment ist das unnötig verschachtelt und damit unübersichtlich. Aber du machst das schon …

    Thread-Starter potthe

    (@potthe)

    Sagst du? hmmmm..
    Ich mach ma zu Ende und dann zeig ich ma was ich damit machen wollte, ist es ok wenn ich dir dann ne PM schicke?

    Hier im Forum können wir uns gerne austauschen,
    dann haben vielleicht auch andere was davon. 🙂

Ansicht von 14 Antworten - 1 bis 14 (von insgesamt 14)
  • Das Thema „querry posts parent and child“ ist für neue Antworten geschlossen.