Вывод кастомных записей на отдельных страницах
На сайте создан кастомный тип записей, под названием Отзывы. В функциях был создан шорткод, чтобы при помощи <?=do_shortcode('[reviews limit="3"]');?> выводить на страницах несколько отзывов. Ниже код шорткода.
add_shortcode('reviews', 'reviews_func'); function reviews_func($atts) { $limit = -1; if (isset($atts['limit']) && (int)$atts['limit'] > 0) { $limit = $atts['limit']; } $reviews = get_reviews($limit); $html = ''; if (!empty($reviews)) { $html .= ' <div class="section"> <div class="container"> <h2 class="mb-5 text-center">Отзывы клиентов</h2> <div class="row"> '; foreach ($reviews as $item) { $html .= ' <div class="col-md-4 mb-5"> <div class="review-card"> <img src="'.$item['image'].'" class="review-card__img"> <div class="review-card__desc"> <p class="h5 text-normal text-center">'.$item['title'].'</p> <p>'.strip_tags($item['content']).'</p> </div> </div> </div> '; } $html .= '</div>'; if ($limit > 0) { $html .= ' <div class="text-center mt-2"> <a href="/reviews/" class="btn btn-white mx-auto">Все реальные отзывы</a> </div> '; } $html .= ' </div> </div> '; } return $html; }
Раньше на всех страницах были одинаковые отзывы, но теперь заказчику понадобилось, на кастомных страницах Услуги, выводить разные отзывы. То есть, если услуга - выкуп авто на штрафстоянке, то выводить созданные отзывы, с определенным текстом, касаемые этой услуги.
Для этого я создал кастомные поля на страницах отзывов в виде чекбоксов по статье WP-Kama:
add_action('add_meta_boxes', 'my_extra_fields', 1); function my_extra_fields() { //add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_func', 'post', 'normal', 'high' ); add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_page_func', 'reviews', 'normal', 'high' ); } ## html код блока для типа записей page function extra_fields_box_page_func(){ ?> <p><label><strong>На каких страницах услуг показывать отзыв?</strong></label><br></p> <p> <input type="hidden" name="extra[highprice]" value=""> <label><input type="checkbox" name="extra[highprice]" value="1" <?php checked( get_post_meta($post->ID, 'highprice', 1), 1 )?> /> Выкуп спецтехники по самой высокой цене</label> <input type="hidden" name="extra[withoutdocs]" value=""> <label><input type="checkbox" name="extra[withoutdocs]" value="1" <?php checked( get_post_meta($post->ID, 'withoutdocs', 1), 1 )?> /> Выкуп авто без документов</label> <input type="hidden" name="extra[snow]" value=""> <label><input type="checkbox" name="extra[snow]" value="1" <?php checked( get_post_meta($post->ID, 'snow', 1), 1 )?> /> Выкуп снегоходов</label> <input type="hidden" name="extra[carshare]" value=""> <label><input type="checkbox" name="extra[carshare]" value="1" <?php checked( get_post_meta($post->ID, 'carshare', 1), 1 )?> /> Выкуп авто из каршеринга</label> <input type="hidden" name="extra[tradein]" value=""> <label><input type="checkbox" name="extra[tradein]" value="1" <?php checked( get_post_meta($post->ID, 'tradein', 1), 1 )?> /> Выкуп авто в трейдин</label> <input type="hidden" name="extra[around]" value=""> <label><input type="checkbox" name="extra[around]" value="1" <?php checked( get_post_meta($post->ID, 'around', 1), 1 )?> /> Выкуп авто круглосуточно</label> <input type="hidden" name="extra[taxi]" value=""> <label><input type="checkbox" name="extra[taxi]" value="1" <?php checked( get_post_meta($post->ID, 'taxi', 1), 1 )?> /> Выкуп авто из таксопарков</label> <input type="hidden" name="extra[pts]" value=""> <label><input type="checkbox" name="extra[pts]" value="1" <?php checked( get_post_meta($post->ID, 'pts', 1), 1 )?> /> Выкуп авто без ПТС</label> <input type="hidden" name="extra[fine]" value=""> <label><input type="checkbox" name="extra[fine]" value="1" <?php checked( get_post_meta($post->ID, 'fine', 1), 1 )?> /> Выкуп авто со штрафстоянки</label> <input type="hidden" name="extra[departure]" value=""> <label><input type="checkbox" name="extra[departure]" value="1" <?php checked( get_post_meta($post->ID, 'departure', 1), 1 )?> /> Выкуп авто с выездом</label> <input type="hidden" name="extra[old]" value=""> <label><input type="checkbox" name="extra[old]" value="1" <?php checked( get_post_meta($post->ID, 'old', 1), 1 )?> /> Выкуп старых авто</label> <input type="hidden" name="extra[cash]" value=""> <label><input type="checkbox" name="extra[cash]" value="1" <?php checked( get_post_meta($post->ID, 'cash', 1), 1 )?> /> Автовыкуп за наличные</label> <input type="hidden" name="extra[new]" value=""> <label><input type="checkbox" name="extra[new]" value="1" <?php checked( get_post_meta($post->ID, 'new', 1), 1 )?> /> Выкуп новых авто</label> <input type="hidden" name="extra[commerce]" value=""> <label><input type="checkbox" name="extra[commerce]" value="1" <?php checked( get_post_meta($post->ID, 'commerce', 1), 1 )?> /> Выкуп коммерческих авто</label> <input type="hidden" name="extra[moto]" value=""> <label><input type="checkbox" name="extra[moto]" value="1" <?php checked( get_post_meta($post->ID, 'moto', 1), 1 )?> /> Выкуп мотоциклов</label> <input type="hidden" name="extra[parsing]" value=""> <label><input type="checkbox" name="extra[parsing]" value="1" <?php checked( get_post_meta($post->ID, 'parsing', 1), 1 )?> /> Выкуп авто на разбор</label> <input type="hidden" name="extra[leasing]" value=""> <label><input type="checkbox" name="extra[leasing]" value="1" <?php checked( get_post_meta($post->ID, 'leasing', 1), 1 )?> /> Выкуп авто из лизинга</label> <input type="hidden" name="extra[faulty]" value=""> <label><input type="checkbox" name="extra[faulty]" value="1" <?php checked( get_post_meta($post->ID, 'faulty', 1), 1 )?> /> Выкуп неисправных авто</label> <input type="hidden" name="extra[pledge]" value=""> <label><input type="checkbox" name="extra[pledge]" value="1" <?php checked( get_post_meta($post->ID, 'pledge', 1), 1 )?> /> Выкуп авто в залоге</label> <input type="hidden" name="extra[ban]" value=""> <label><input type="checkbox" name="extra[ban]" value="1" <?php checked( get_post_meta($post->ID, 'ban', 1), 1 )?> /> Выкуп авто в запрете</label> <input type="hidden" name="extra[dtp]" value=""> <label><input type="checkbox" name="extra[dtp]" value="1" <?php checked( get_post_meta($post->ID, 'dtp', 1), 1 )?> /> Выкуп авто после ДТП</label> <input type="hidden" name="extra[credit]" value=""> <label><input type="checkbox" name="extra[credit]" value="1" <?php checked( get_post_meta($post->ID, 'credit', 1), 1 )?> /> Выкуп кредитных авто</label> </p> <?php }
Это нужно, чтобы можно было в выбранном отзыве, поставить галочку напротив названия определенной Услуги, и этот отзыв появился на ее странице. Кастомные поля фунциклируют, но теперь мне нужно каким-то образом изменить код шорткода отзывов, чтобы он ловил зависимости от проставленных чекбоксов и выводил на странице конкретной услуги, только те отзывы, внутри которых будут проставлены галочки в чекбоксах. Может вообще нужен другой подход, более оптимизированный.
Скиньте код функции: get_reviews
Ведь именно в ней идет запрос на выборку отзывов. И там нужно дописыв доп параметры, чтоб отзывы приходили с учетом метаполя.
Также вопрос:
один отзыв может быть показан на разных страницах? может быть привязан к разным услугам, верно?
Да конечно, может быть привязан к разным услугам
я сегодня вечером напишу решение.
неудобно то, что связи отзывов хранятся в разных мета полях
а не в одном.
Но я переделывать не буду.
Просто решение по текущему коду.
Вот такие аргументы передаются в get_posts:
Скидываю ниже обновленный код. (не тестировал, но работать должен)
в ручную нужно будет прописывать ключи метаполей в шорткоде?
логично, а как по-другому?
вы же вызываете шорткод на разных услугах, на которых должны быть разные отзывы.
Вот один и тот же шорткод будет выдавать разные отзывы в зависим от переданных параметров.
там одна страница-шаблон php, которая выводит услуги разные, там разные только заголовки в принципе... и шорткод вставляется один раз, возможности добавлять параметры под разные страницы в ручную нет...
есть возможность, вы просто не знаете еще о ней.
или я что-то не так понимаю) сейчас попробую использовать ваш код
Услуга - это как запись, Custom Post Type ?
В админке ведь есть страница каждой услуги - редактируются они?
Так вот - в админке к каждой услуги укажите добавьте метполе, ГДЕ вы пропишите как раз ключи, по которым должны показываться отзывы.
Потом в том шаблоне, где добавл шорткод - как раз вытягиваете ключи от услуги - и подставл их в шорткод.
че-то скончался сайт...
включайте лог ошибок, смотрите в чем именно ошибка.
Я код запускал на PHP версии 8+
скрин сделан из рабочей страницы.
а можно без изменений самого шорткода, скажем, в том месте, где его вывод идет, задать условия проверки - "если в метабоксе стоит галочка и ID поста такой-то, то выводим шорткод"?
КОД НЕ копируйте
а переносите те части, которых нет в вашем коде.
Так заодно поймете, что я добавил.
можно наверное, все что хочешь можно.
Я вопроса пока что не понял.
Вникните в задачу - найдите решение.
типа
синтаксис для примера... я примерно так пробовал, но че то ни че не выходит... и метаполя не подтягиваются, а с id поста вообще непонятно...здесь вне цикла получается, и посты кастомного типа... или плохо ищу или что...
Еще раз: под вашу задачу изменение шорткода ЕСТЬ обязательным.
ИЛИ вы под каждый тип услуг делаете свой шорткод, что есть немного бред.
Именно в шорткоде идет запрос в БД на выборку отзывов. в шорткоде идет вызвов функции get_posts()
ну в общем, все нормально) как вы и сказали, создал метаполе на странице услуг, прописал туда ее ключ, и этот ключ подставил в ваш шорткод... поле скрыл, чтобы глаза не мозолило в админке и все. Вам спасибо за помощь! Пусть ваше имя отзовется в вечности Thanks!
Ок, спасибо! (:
Отмечайте вопрос решенным.