Шордкод выводит неверно?

Ссылка скопирована
1 ответ

Такой вопрос, есть шордкод, который выводит блоки с ценами.

function price_shortcode_function() {    ob_start(); 	?> 	<div class="price__wrap">             <?php                 $price = get_posts( array(                     'post_type' => 'price',                     'posts_per_page' => -1,                 ) );                 foreach( $price as $post ): setup_postdata($post);                     get_template_part( 'template-parts/price-item', get_post_format() );                 endforeach; wp_reset_postdata(); ?>         </div> <?php 	return ob_get_clean(); } add_shortcode('price_shortcode', 'price_shortcode_function');

function price_shortcode_function() { ob_start(); ?> <div class="price__wrap"> <?php $price = get_posts( array( 'post_type' => 'price', 'posts_per_page' => -1, ) ); foreach( $price as $post ): setup_postdata($post); get_template_part( 'template-parts/price-item', get_post_format() ); endforeach; wp_reset_postdata(); ?> </div> <?php return ob_get_clean(); } add_shortcode('price_shortcode', 'price_shortcode_function');

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

Дополнительно:

Ответы:

return ob_get_clean(); что такое ob_get_clean?
https://www.google.com/search?ie=utf-8&q=setup_pos...
не могу дать конкретную ссылку, редактор выдаёт ошибку. Поэтому даю ссылку на поиск гугла и там ссылка что на фото.

Шордкод выводит неверно?

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Виктор Sys Ответ

В шорткоде проблема в области видимости переменной $post. Внутри foreach ($price as $post) Вы используете имя $post, но не объявляете его как global, а setup_postdata() работает именно с глобальным объектом поста. Из-за этого шаблон может брать данные текущей страницы, а не элемента из списка.

Исправьте так:

function price_shortcode_function() {
    ob_start();
 
    $price_posts = get_posts([
        'post_type'      => 'price',
        'posts_per_page' => -1,
    ]);
 
    if ($price_posts) {
        echo '<div class="price__wrap">';
 
        global $post;
        foreach ($price_posts as $post) {
            setup_postdata($post);
            get_template_part('template-parts/price-item');
        }
        wp_reset_postdata();
 
        echo '</div>';
    }
 
    return ob_get_clean();
}
add_shortcode('price_shortcode', 'price_shortcode_function');

function price_shortcode_function() { ob_start(); $price_posts = get_posts([ 'post_type' => 'price', 'posts_per_page' => -1, ]); if ($price_posts) { echo '<div class="price__wrap">'; global $post; foreach ($price_posts as $post) { setup_postdata($post); get_template_part('template-parts/price-item'); } wp_reset_postdata(); echo '</div>'; } return ob_get_clean(); } add_shortcode('price_shortcode', 'price_shortcode_function');

Ещё лучше не использовать get_posts(), а сделать WP_Query, но для простого списка этот вариант тоже нормальный.

Проверьте шаблон price-item.php. Если там используются the_title(), the_field(), the_permalink(), они должны работать после setup_postdata(). Если там вручную берутся поля через get_field() без ID, это тоже зависит от текущего глобального поста.

Если шаблон всё равно берёт заголовок страницы, передавайте ID явно:

$post_id = get_the_ID();
echo esc_html(get_the_title($post_id));
echo esc_html(get_field('price_value', $post_id));

$post_id = get_the_ID(); echo esc_html(get_the_title($post_id)); echo esc_html(get_field('price_value', $post_id));

Итог: причина не в shortcode как таковом, а в глобальном посте. Для шорткодов особенно важно после своего цикла вызывать wp_reset_postdata(), иначе можно сломать остальной контент страницы.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно