WordPress Shortcode Возвращает «Массив»

Я делаю специальный шорт-код, который в основном предназначен для возврата моего пользовательского типа сообщения, вот мой код:

function shortcode_slider($atts, $content=null){ extract(shortcode_atts( array('id' => ''), $atts)); $return = $content; $return .= query_posts( array( 'post_status' => 'publish' , 'post_type' => 'slider' ) ); return $return; } add_shortcode('slider', 'shortcode_slider'); 

Штрих-код работает нормально, кроме одного – когда он возвращает все сообщения, он также возвращает «массив» в верхней части списка – любая идея, почему это произойдет?

Кроме того, я хочу иметь возможность использовать вход «id», чтобы иметь возможность указывать категорию, например

  $return .= query_posts( array( 'post_status' => 'publish' , 'post_type' => 'slider', 'category' => $id ) ); 

но я не уверен в правильном синтаксисе для этого.

Буду признателен за любую оказанную помощь.

Прежде всего, не используйте query_posts .
Пожалуйста, проверьте:

  • Когда следует использовать WP_Query vs query_posts () vs get_posts ()?
  • Когда использовать WP_query (), query_posts () и pre_get_posts

В случае с коротким кодом я бы пошел с get_posts . Он вернет вам то, что вам нужно, и не столкнется с циклом.

Стоит отметить, что вам действительно не нужно извлекать атрибуты, используя $atts['id'] делает работу.

Следуя действующему короткому коду, см. Комментарии:

 add_shortcode( 'slider', 'shortcode_slider' ); function shortcode_slider( $atts, $content=null ) { // Initialize variable and check for shortcode content $return = ''; if( $content ) { $return = $content; } // Shortcode attribute: title="Lorem Ipsum" if( isset( $atts['title'] ) ) { $return .= '<br><h2>' . $atts['title'] . '</h2>'; } // Get our custom posts // 'category' is the category ID or a comma separated list of ID numbers $sliders = get_posts( array( 'post_status' => 'publish', 'post_type' => 'slider', 'numberposts' => 10, 'order'=> 'ASC', 'orderby' => 'title', 'category' => $atts['id'] ) ); // Auxiliary variable, don't print <br> in the first element $first = ''; // Iterate through the resulting array // and build the final output // Use $slide->post_author, ->post_excerpt, as usual // $slide->ID can be used to call auxiliary functions // such as get_children or get_permalink foreach( $sliders as $slide ) { $link = get_permalink( $slide->ID ); $return .= $first . '<a href="' . $link . '">' . $slide->post_title . '</a> '; $first = '<br>'; } return $return; } - add_shortcode( 'slider', 'shortcode_slider' ); function shortcode_slider( $atts, $content=null ) { // Initialize variable and check for shortcode content $return = ''; if( $content ) { $return = $content; } // Shortcode attribute: title="Lorem Ipsum" if( isset( $atts['title'] ) ) { $return .= '<br><h2>' . $atts['title'] . '</h2>'; } // Get our custom posts // 'category' is the category ID or a comma separated list of ID numbers $sliders = get_posts( array( 'post_status' => 'publish', 'post_type' => 'slider', 'numberposts' => 10, 'order'=> 'ASC', 'orderby' => 'title', 'category' => $atts['id'] ) ); // Auxiliary variable, don't print <br> in the first element $first = ''; // Iterate through the resulting array // and build the final output // Use $slide->post_author, ->post_excerpt, as usual // $slide->ID can be used to call auxiliary functions // such as get_children or get_permalink foreach( $sliders as $slide ) { $link = get_permalink( $slide->ID ); $return .= $first . '<a href="' . $link . '">' . $slide->post_title . '</a> '; $first = '<br>'; } return $return; } 

Shortcode применяется в типе сообщения по умолчанию:

короткий код

Пользовательские типы сообщений:

CPT

Результат:

Результат короткого кода cpt

Полезные ссылки:

  • WordPress Shortcodes: полное руководство
  • Как добавить короткие коды в плагин WordPress

Кажется, что «массив» включен, потому что сначала вы используете $ content. Чтобы быть действительно уверенным, вам придется публиковать, как вы пишете этот короткий код в сообщении, но это общая идея. Вам, вероятно, не нужна строка:

 $return = $content; 

Если ваш синтаксис короткого кода – это [slider]some text[/slider] , то указанная выше строка в порядке.

Что касается второй части, вы должны получить идентификатор, используя $ atts ['id'] в своем коде. Ваш короткий код будет:

 [slider id="5"] 

Причина, по которой он печатает Array, находится прямо здесь:

 $return .= query_posts( ... 

Сначала вы устанавливаете $return в строку содержимого. Затем вы добавляете массив, возвращаемый query_posts() . Я немного удивлен, что вы не получаете ошибку «array to string conversion», но, возможно, вы ее подавляете.

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

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