Вывод кастомных записей на отдельных страницах
На сайте создан кастомный тип записей, под названием Отзывы. В функциях был создан шорткод, чтобы при помощи <?=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
Ведь именно в ней идет запрос на выборку отзывов. И там нужно дописыв доп параметры, чтоб отзывы приходили с учетом метаполя.
Также вопрос:
один отзыв может быть показан на разных страницах? может быть привязан к разным услугам, верно?
Да конечно, может быть привязан к разным услугам
function get_reviews($limit = -1) { $items = array(); $item_raw = get_posts(array( 'post_type' => 'reviews', 'post_status' => 'publish', 'order' => 'DESC', 'orderby' => 'ID', 'suppress_filters' => true, 'numberposts' => $limit, )); if (!empty($item_raw)) { foreach($item_raw as $item) { $image = get_the_post_thumbnail_url($item->ID, 'medium'); $image = !empty($image) ? $image : '/wp-content/themes/theme/images/noimage.png'; $items[] = array( 'id' => $item->ID, 'title' => $item->post_title, 'url' => get_permalink($item->ID), 'image' => $image, 'content' => $item->post_content, ); } } return $items; }я сегодня вечером напишу решение.
неудобно то, что связи отзывов хранятся в разных мета полях
а не в одном.
Но я переделывать не буду.
Просто решение по текущему коду.
do_shortcode('[reviews limit="3" checkbox_fields="withoutdocs,tradein"]');Вот такие аргументы передаются в get_posts:
Скидываю ниже обновленный код. (не тестировал, но работать должен)
add_shortcode( 'reviews', 'reviews_func' ); function reviews_func( $atts ) { $limit = - 1; if ( isset( $atts['limit'] ) && (int) $atts['limit'] > 0 ) { $limit = $atts['limit']; } $checkbox_fields = []; if ( isset( $atts['checkbox_fields'] ) && $atts['checkbox_fields'] ) { $checkbox_fields = explode( ',', $atts['checkbox_fields'] ); } $reviews = get_reviews( $limit, $checkbox_fields ); $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; } function get_reviews( $limit = - 1, $checkbox_fields = [] ) { $items = array(); $meta_query = []; if ( $checkbox_fields ) { $meta_query['relation'] = 'OR'; foreach ( $checkbox_fields as $field_key ) { $meta_query[] = [ 'key' => $field_key, 'value' => 1, ]; } } $item_raw = get_posts( array( 'post_type' => 'reviews', 'post_status' => 'publish', 'order' => 'DESC', 'orderby' => 'ID', 'suppress_filters' => true, 'numberposts' => $limit, 'meta_query' => $meta_query ) ); if ( ! empty( $item_raw ) ) { foreach ( $item_raw as $item ) { $image = get_the_post_thumbnail_url( $item->ID, 'medium' ); $image = ! empty( $image ) ? $image : '/wp-content/themes/theme/images/noimage.png'; $items[] = array( 'id' => $item->ID, 'title' => $item->post_title, 'url' => get_permalink( $item->ID ), 'image' => $image, 'content' => $item->post_content, ); } } return $items; }в ручную нужно будет прописывать ключи метаполей в шорткоде?
логично, а как по-другому?
вы же вызываете шорткод на разных услугах, на которых должны быть разные отзывы.
Вот один и тот же шорткод будет выдавать разные отзывы в зависим от переданных параметров.
там одна страница-шаблон php, которая выводит услуги разные, там разные только заголовки в принципе... и шорткод вставляется один раз, возможности добавлять параметры под разные страницы в ручную нет...
есть возможность, вы просто не знаете еще о ней.
или я что-то не так понимаю) сейчас попробую использовать ваш код
Услуга - это как запись, Custom Post Type ?
В админке ведь есть страница каждой услуги - редактируются они?
Так вот - в админке к каждой услуги укажите добавьте метполе, ГДЕ вы пропишите как раз ключи, по которым должны показываться отзывы.
Потом в том шаблоне, где добавл шорткод - как раз вытягиваете ключи от услуги - и подставл их в шорткод.
че-то скончался сайт...
включайте лог ошибок, смотрите в чем именно ошибка.
Я код запускал на PHP версии 8+
скрин сделан из рабочей страницы.
а можно без изменений самого шорткода, скажем, в том месте, где его вывод идет, задать условия проверки - "если в метабоксе стоит галочка и ID поста такой-то, то выводим шорткод"?
КОД НЕ копируйте
а переносите те части, которых нет в вашем коде.
Так заодно поймете, что я добавил.
можно наверное, все что хочешь можно.
Я вопроса пока что не понял.
Вникните в задачу - найдите решение.
типа
if ( post_id(357) && get_post_meta($post->ID, 'withoutdocs', 1) || post_id(358) && get_post_meta($post->ID, 'tradein', 1)) { do_shortcode('[reviews limit="3"]'); }синтаксис для примера... я примерно так пробовал, но че то ни че не выходит... и метаполя не подтягиваются, а с id поста вообще непонятно...здесь вне цикла получается, и посты кастомного типа... или плохо ищу или что...
Еще раз: под вашу задачу изменение шорткода ЕСТЬ обязательным.
ИЛИ вы под каждый тип услуг делаете свой шорткод, что есть немного бред.
Именно в шорткоде идет запрос в БД на выборку отзывов. в шорткоде идет вызвов функции get_posts()
ну в общем, все нормально) как вы и сказали, создал метаполе на странице услуг, прописал туда ее ключ, и этот ключ подставил в ваш шорткод... поле скрыл, чтобы глаза не мозолило в админке и все. Вам спасибо за помощь! Пусть ваше имя отзовется в вечности))) Thanks!
Ок, спасибо! (:
Отмечайте вопрос решенным.