Шордкод выводит неверно?
Такой вопрос, есть шордкод, который выводит блоки с ценами.
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...
не могу дать конкретную ссылку, редактор выдаёт ошибку. Поэтому даю ссылку на поиск гугла и там ссылка что на фото.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

В шорткоде проблема в области видимости переменной
$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');
Ещё лучше не использовать
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));
Итог: причина не в shortcode как таковом, а в глобальном посте. Для шорткодов особенно важно после своего цикла вызывать
wp_reset_postdata(), иначе можно сломать остальной контент страницы.