Вывод шорткода слишком рано

Я пытаюсь создать базу шорткодов:

<ul class="filter">
<li>Filter:</li>
<li class="link-store"><a href="<?php echo get_permalink( 23 ); ?>">All</a></li>
    <?php global $post; $thispage = $post->ID; // берет идентификатор текущей записи из глобального массива и затем назначает его этой странице ?>
    <?php $pagekids = get_pages("child_of=".$thispage."&sort_column=menu_order"); // получает список страниц, которые являются подстраницами текущей страницы, и назначает их затем pagekids ?>

    <?php if ($pagekids) { // если в pagekids хранятся какие-либо значения, и поэтому текущая страница имеет подстраницы ?>
        <ul>
            <?php wp_list_pages("depth=1&title_li=&sort_column=menu_order&child_of=".$thispage); // отображать только подстраницы текущей страницы ?>
        </ul>
            <?php } elseif($post->post_parent)
               $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0"); if ($children) { // если для текущей страницы нет подстраниц ?>
        <ul>
            <?php echo $children; ?>
        </ul>
            <?php } ?>
        </ul>

Вне всякого сомнения, это действительно хороший ресурс, поскольку он возвращает дочерние страницы и даже страницы брата.

Я пытаюсь создать короткий код:

function filter_store ( $atts ) {
global $post; $thispage = $post->ID;
if ($pagekids) {
   $output .= '<ul>';
      wp_list_pages("depth=1&title_li=&sort_column=menu_order&child_of=".$thispage);
       $output .= '</ul>';   
            } elseif($post->post_parent) 
           $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0"); if ($children) {
       $output .= '<ul>';
            echo $children;
       $output .= '</ul>';
            }
        return $output;
    }

   add_shortcode('filter', 'filter_store');

Я потратил около 3 часов, пытаясь найти причину ошибки и был бы признателен за любую помощь в этом.

Заранее спасибо.

Понравился вопрос? Нужен ответ? Поддержите проект
WPAsk
Ответов: 3
  1. Harkály Gergő

    Ваша проблема в том, что шорткод появляется перед другим контентом, а не там, где вы хотите? Если да, вы можете решить эту проблему следующим образом:

    function filter_store()
    {
        ob_start();
        ...
        echo $children;
        ...
        $ReturnString = ob_get_contents();
        ob_end_clean();
        return $ReturnString;
    }
    
  2. fuxia

    Шорткод должен возвращать только строку, вы не должны печатать что-то вроде wp_list_pages() или echo .

    Возвращаемое значение функции обработчика шорткода вставляется в вывод содержимого публикации. Не забудьте использовать return , а не echo — все, что отображается, будет выводиться в браузер, но не будет отображаться в правильном месте на странице.

  3. nu everest

    В разделе https://codex.wordpress.org/Shortcode_API рекомендуется этот шаблон.

    function my_shortcode() {
        ob_start();
        ?> <HTML> <here> ... <?php
        return ob_get_clean();
    }
    

Добавить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: