Как заставить этот wp_query работать в шорткоде?

Я не могу заставить wp_query работать в шорткоде. Я думаю, что у меня все правильно в соответствии с кодексом wp, но он продолжает ломать мой сайт - ошибка 500. Он находится во внешнем файле пользовательской темы Genesis.

Файл находится в подпапке, и я включил файл один раз и добавил функцию add_shortcode в файл functions.php. Когда я комментирую include_once, сайт хороший, поэтому я предполагаю, что мне что-то не хватает в функции.

<?php
function exp_post_slider_shortcode( $atts ) {

$a = shortcode_atts( array(
    'cat' => '15',
    'posts_per_page' => '3',
), $atts ); 

$output = '';   
 $args = array(

            'cat' => $a['cat'],
            'posts_per_page' => $a['posts_per_page'],
);
    $post_slider = new WP_Query( $args );

if ( $post_slider->have_posts() ) {
    // The Loop
     $output .=  '<div class="exp-post-slider-container">'
     $output .= '<div class="owl-carousel owl-theme exp-post-slider">'
    while ( $post_slider->have_posts() ) {
        $post_slider->the_post();
        $feat_image_url = wp_get_attachment_url( get_post_thumbnail_id($post->ID) );
        $output .= '<div class="exp-cat-slide" style="background-image:url('.$feat_image_url.'); background-size:cover; background-repeat:no-repeat;">';
        $output .= '<div class="exp-slide-post-info">';
        $output .= '<h2>' . get_the_title() . '</h2>';
        $output .= '<p>' . get_the_author() . ' | ' . get_the_date() . '</p>';
        $output .= '<p><a href="' . get_permalink() . '" class="exp-post-link-btn">View Post</a>';
        $output .= '</div></div>';
    }

    wp_reset_postdata();
} else { 

        $output .= '<div class="exp-cat-slide" style="background-image:url(https://webclient.co/explore/wp-content/uploads/2019/04/looking-out-no-posts.jpg); background-size:cover; background-repeat:no-repeat;">';
        $output .= '<div class="exp-slide-post-info">';
        $output .= '<h2>No Adventures Posted Here Yet</h2>';
        $output .= '<p>Check Back Soon!</p>';
        $output .= '<p><a href="https://webclient.co/explore/blog/" class="exp-post-link-btn">Check Out Our Blog</a>';
        $output .= '</div></div>';
}


$output .= '</div>'
$output .= '</div>'

return $output;
} ?>

Я пытаюсь вывести вывод на слайдер совы. Не проблема заставить его работать как функцию в хуке темы, но мне нужно, чтобы он работал как шорткод с категорией и количеством параметров публикации.


person Doug Morris    schedule 04.04.2019    source источник
comment
Можете ли вы опубликовать код, в котором вы включаете файл сверху? Вы проверили свой журнал ошибок, чтобы выяснить, о чем ошибка сервера?   -  person mynd    schedule 04.04.2019
comment
Исходный код, который я разместил, находится в отдельном файле. Этот код находится в файле functions.php, загружаем и регистрируем шорткод. //* Add post slider shortcode include_once( get_stylesheet_directory() . '/shortcodes/exp-rp-slider.php' ); //* Add post slider shortcode add_shortcode( 'expslider', 'exp_post_slider_shortcode' );   -  person Doug Morris    schedule 04.04.2019


Ответы (2)


Я только что переместил предоставленный вами код в тестовую среду Wordpress, и становится очевидным, что вам не хватает некоторого ; в конце строки при использовании вашей переменной $output.

С помощью приведенного ниже кода я могу вывести ваш шорткод:

add_shortcode('test','exp_post_slider_shortcode');

function exp_post_slider_shortcode( $atts ) {

$a = shortcode_atts( array(
    'cat' => '15',
    'posts_per_page' => '3',
), $atts ); 

$output = '';   
 $args = array(

            'cat' => $a['cat'],
            'posts_per_page' => $a['posts_per_page'],
);
    $post_slider = new WP_Query( $args );

if ( $post_slider->have_posts() ) {
    // The Loop
     $output .=  '<div class="exp-post-slider-container">';
     $output .= '<div class="owl-carousel owl-theme exp-post-slider">';
    while ( $post_slider->have_posts() ) {
        $post_slider->the_post();
        $feat_image_url = wp_get_attachment_url( get_post_thumbnail_id($post->ID) );
        $output .= '<div class="exp-cat-slide" style="background-image:url('.$feat_image_url.'); background-size:cover; background-repeat:no-repeat;">';
        $output .= '<div class="exp-slide-post-info">';
        $output .= '<h2>' . get_the_title() . '</h2>';
        $output .= '<p>' . get_the_author() . ' | ' . get_the_date() . '</p>';
        $output .= '<p><a href="' . get_permalink() . '" class="exp-post-link-btn">View Post</a>';
        $output .= '</div></div>';
    }

    wp_reset_postdata();
} else { 

        $output .= '<div class="exp-cat-slide" style="background-image:url(https://webclient.co/explore/wp-content/uploads/2019/04/looking-out-no-posts.jpg); background-size:cover; background-repeat:no-repeat;">';
        $output .= '<div class="exp-slide-post-info">';
        $output .= '<h2>No Adventures Posted Here Yet</h2>';
        $output .= '<p>Check Back Soon!</p>';
        $output .= '<p><a href="https://webclient.co/explore/blog/" class="exp-post-link-btn">Check Out Our Blog</a>';
        $output .= '</div></div>';
}


$output .= '</div>';
$output .= '</div>';

return $output;
}

Еще одно замечание: обратите внимание на выходной буфер. Если вы столкнулись с тем, что содержимое вашего шорткода размещается не там, где вы ожидаете, взгляните на функцию ob_get_clean().

person mynd    schedule 04.04.2019
comment
Большое спасибо, я взял код из части шаблона, которую я сделал, и добавил функции вывода и не подумал добавить точку с запятой. Спасибо, что нашли время, чтобы указать на это? - person Doug Morris; 04.04.2019
comment
Рад, что смог помочь! - person mynd; 04.04.2019

Вам нужна функция add_shortcode, чтобы превратить вашу функцию в шорткод. Очень хорошая документация по этому вопросу от WP: https://codex.wordpress.org/Shortcode_API

Может выглядеть так:

add_shortcode( 'exp_post_slider', 'exp_post_slider_shortcode' );

Затем в редакторе вы можете использовать это в своем контенте, чтобы вызвать функцию exp_post_slider_shortcode и сгенерировать вывод:

[exp_post_slider whatever_args="whatever..."]
person BugsArePeopleToo    schedule 04.04.2019
comment
У меня работает шорткод. Я могу ввести простую функцию для выполнения, и она работает. Проблема в том, что я не могу заставить предоставленный wp_query работать в шорткоде. Он продолжает ломать сайт, и я не уверен, правильно ли я делаю wp_query внутри функции шорткода. - person Doug Morris; 04.04.2019