Поддержка Проблемы и решения Дочерние страницы через шорткод

  • Решено vsezanyatouzhe

    (@vsezanyatouzhe)


    Добрый вечер.
    Есть функция, которую я подключаю в page.php

    function asd() {
    $childpages = new WP_Query( array(
    	'post_type'      => 'page',
    	'post_parent'    => $this_page,
    	'posts_per_page' => 100,
    	'orderby'        => 'menu_order',
    	'post__in' => array( 11 )
    ));
    	while ( $childpages->have_posts() ) : $childpages->the_post(); ?>
    
    	<section>
    
    		<a href="<?php echo get_page_link( $page->ID );?>"><?php the_title(); ?></a>
    			<div class="content">
    
    				<?php $this_subpage=$post->ID; ?>
    
    				<?php
    				//Loop through the sub-pages of the child pages next
    				$subpages = new WP_Query( array(
    					'post_type' => 'page',
    					'post_parent' => $this_subpage,
    					'posts_per_page' => 0,
    					'orderby' => 'menu_order',
    					'post_parent__in' => array(11)
    				));
    				while ( $subpages->have_posts() ) : $subpages->the_post(); ?>
    					<section class="subpages">
    
    						<a href="<?php echo get_page_link( $page->ID );?>"><?php the_title(); ?></a>
    						<div>
    
    						</div>
    					</section>
    				<?php endwhile; wp_reset_query(); ?>
    
    		</div><!--.content -->
    	</section>
    <?php endwhile; wp_reset_query(); }
     asd();?>

    Таким образом она выводит родительскую страницу и ее дочерние — выводит нормально.

    Е пытаюсь добавить ее через шорткод (не особо в этом) делаю так:

    function wp_p() {
    
    $childpages = new WP_Query( array(
    	'post_type'      => 'page',
    	'post_parent'    => $this_page,
    	'posts_per_page' => 100,
    	'orderby'        => 'menu_order',
    	'post__in' => array( 11 )
    ));
    	while ( $childpages->have_posts() ) : $childpages->the_post(); 
    
    	$string1 =  '<ul class="side-menu"><li><a href="'.get_page_link( $post->ID ).'">'.get_the_title().'</a></li>';
    
    				 $this_subpage=$post->ID; 
    
    				//Loop through the sub-pages of the child pages next
    				$subpages = new WP_Query( array(
    					'post_type' => 'page',
    					'post_parent' => $this_subpage,
    					'posts_per_page' => -1,
    					'order' => 'ASC',
    					'orderby' => 'date',
    					'post_parent__in' => array(11)
    				));
    				while ( $subpages->have_posts() ) : $subpages->the_post();
    
    					$string2 =  '<li><a href="'.get_page_link( $post->ID ).'">'.get_the_title().'</a></li></ul>';
    						return $string1.$string2;
    
    				endwhile; wp_reset_query();
    
     endwhile; wp_reset_query(); 
    
    }
    add_shortcode('lch', 'wp_p');

    Таким образом она выводит только родительскую страницу и одну дочернюю, на всех дочерних только одну последнюю добавленную (ну в таком варианте ‘order’ => ‘ASC’,
    ‘orderby’ => ‘date’,) первую добавленную

    Подскажите пожалуйста, что не так?

Просмотр 15 ответов — с 1 по 15 (всего 17)
  • Предположим, что все выбирается, как хотелось и циклы работают. Посмотрите внимательно в какой момент функция вернет $string1.$string2 и что будет в этих переменных.
    В принципе есть готовая функция get_children()

    Я не так силен в php, как хотелось бы)
    Как посмотреть в какой момент она что-либо возвращает?

    Я не так силен в php, как хотелось бы)

    хм. ну это дело наживное.
    А пока вам сюда http://wp-kama.ru/function/wp_list_pages

    что касается самой функции шорткода, то она должна возвращать некое значение (то, что должно отобразиться) в самом конце, то есть после сбора всей информации. У вас же возврат(выход из функции) происходит в цикле 1-1 (первая страница.первая ее дочерняя) Если вынесите return $string1.$string2; за скобки циклов, то отработают все циклы, но вернутся только последние значения, так как накопление результатов у вас не предусмотрено.

    Спасибо, а каким образом происходит накопление результатов? Если не сложно, скажите пожалуйста

    $str="исходная";
    $a="строка1";
    $b=' ';
    $str.=$b.$a;  // теперь в переменной будет "исходная строка1"

    и все таки пристроитесь к функции wp_list_pages()
    указав правильные параметры, она выдаст вам то, что вы делаете вручную.

    vsezanyatouzhe,
    1. В цикле каждый раз переписываются переменные $string1 и $string2. Исправьте.
    2. Перенесите return $string1.$string2; за циклы, т.е. return должен встать перед фигурной скобкой, которая закрывает функцию asd().

    Gerga,
    Через функцию с супер названием asd() все работает как нужно, она вставлена в page.php

    Через шоркод, который в function.php так не пашет. return перенес за циклы

    Joys66
    я в функцию должен добавить переменные?
    function wp_p($str = », $a = ») {

    я в функцию должен добавить переменные?

    нет конечно. Я просто показал пример синтаксиса PHP

    В asd() «пашет» потому что там сразу выводятся значения string1 и string2
    по ходу выполнения циклов. В функции шорткода, вам надо до завершения всех циклов сохранять значения в какую-нибудь переменную (с накоплением) и только после этого делать return этой переменной.

    Ну исходя из того как я понял, сделал так:

    function wp_p() {
    $childpages = new WP_Query( array(
    	'post_type'      => 'page',
    	'post_parent'    => $this_page,
    	'posts_per_page' => 100,
    	'orderby'        => 'menu_order',
    	'post__in' => array( 11 )
    ));
    	while ( $childpages->have_posts() ) : $childpages->the_post(); 
    
    	$string1 =  '<ul class="side-menu">
    <li><a>ID ).'">'.get_the_title().'</a></li>
    ';
    
    				 $this_subpage=$post->ID; 
    
    				//Loop through the sub-pages of the child pages next
    				$subpages = new WP_Query( array(
    					'post_type' => 'page',
    					'post_parent' => $this_subpage,
    					'posts_per_page' => -1,
    					'order' => 'ASC',
    					'orderby' => 'date',
    					'post_parent__in' => array(11)
    				));
    				while ( $subpages->have_posts() ) : $subpages->the_post();
    
    					$string2 =  '
    <li><a>ID ).'">'.get_the_title().'</a></li>
    ';
    
    $result = $string1.$string2;
    
    				endwhile; wp_reset_postdata
    
     endwhile; wp_reset_postdata
    return $result;
    }
    add_shortcode('lch', 'wp_p');

    Результат не изменился

    это я так вставил код что ли?) все поплыло

    замените свою функццию на это

    function wp_p() {
     global $post;
    $str="<ul class='my_menu'>";
    $id=$post->ID;
    $str.=wp_list_pages("child_of= {$id}&sort_column=menu_order&echo=0&title_li=");
    $str.="</ul>";
     return $str; 
    
    }

    Пришлось изменить структуру шаблона, вывожу теперь без шорткода.

    Joys66
    Попробовал этот вариант, не выводит вообще ничего.

    Если точнее то при return $str; ничего не выводится ни на родительской ни на дочерней, если вернуть 1, то на родительской выводит эту единицу, на дочерних нет

    исправьте свой пост выше (код должен быть в code). а то непонятно где чего

Просмотр 15 ответов — с 1 по 15 (всего 17)
  • Тема «Дочерние страницы через шорткод» закрыта для новых ответов.