WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Вывод кастомных записей на отдельных страницах

На сайте создан кастомный тип записей, под названием Отзывы. В функциях был создан шорткод, чтобы при помощи <?=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
	}

Это нужно, чтобы можно было в выбранном отзыве, поставить галочку напротив названия определенной Услуги, и этот отзыв появился на ее странице. Кастомные поля фунциклируют, но теперь мне нужно каким-то образом изменить код шорткода отзывов, чтобы он ловил зависимости от проставленных чекбоксов и выводил на странице конкретной услуги, только те отзывы, внутри которых будут проставлены галочки в чекбоксах. Может вообще нужен другой подход, более оптимизированный.

0
cazumbra
11 месяцев назад
  • 1
    stepan2273 www.weblancer.net/users/stepanko/?affili...
    $reviews = get_reviews($limit);

    Скиньте код функции: get_reviews
    Ведь именно в ней идет запрос на выборку отзывов. И там нужно дописыв доп параметры, чтоб отзывы приходили с учетом метаполя.

    Также вопрос:
    один отзыв может быть показан на разных страницах? может быть привязан к разным услугам, верно?

    cazumbra 11 месяцев назад

    Да конечно, может быть привязан к разным услугам

    cazumbra 11 месяцев назад
    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;
    }
    stepan 11 месяцев назад

    я сегодня вечером напишу решение.
    неудобно то, что связи отзывов хранятся в разных мета полях
    а не в одном.
    Но я переделывать не буду.
    Просто решение по текущему коду.

    stepan 11 месяцев назад
    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;
    }
    cazumbra 11 месяцев назад

    в ручную нужно будет прописывать ключи метаполей в шорткоде?

    stepan 11 месяцев назад

    логично, а как по-другому?
    вы же вызываете шорткод на разных услугах, на которых должны быть разные отзывы.
    Вот один и тот же шорткод будет выдавать разные отзывы в зависим от переданных параметров.

    cazumbra 11 месяцев назад

    там одна страница-шаблон php, которая выводит услуги разные, там разные только заголовки в принципе... и шорткод вставляется один раз, возможности добавлять параметры под разные страницы в ручную нет...

    stepan 11 месяцев назад

    есть возможность, вы просто не знаете еще о ней.

    cazumbra 11 месяцев назад

    или я что-то не так понимаю) сейчас попробую использовать ваш код

    stepan 11 месяцев назад

    Услуга - это как запись, Custom Post Type ?
    В админке ведь есть страница каждой услуги - редактируются они?

    stepan 11 месяцев назад

    Так вот - в админке к каждой услуги укажите добавьте метполе, ГДЕ вы пропишите как раз ключи, по которым должны показываться отзывы.
    Потом в том шаблоне, где добавл шорткод - как раз вытягиваете ключи от услуги - и подставл их в шорткод.

    cazumbra 11 месяцев назад

    че-то скончался сайт...

    stepan 11 месяцев назад

    включайте лог ошибок, смотрите в чем именно ошибка.
    Я код запускал на PHP версии 8+
    скрин сделан из рабочей страницы.

    cazumbra 11 месяцев назад

    а можно без изменений самого шорткода, скажем, в том месте, где его вывод идет, задать условия проверки - "если в метабоксе стоит галочка и ID поста такой-то, то выводим шорткод"?

    stepan 11 месяцев назад

    КОД НЕ копируйте
    а переносите те части, которых нет в вашем коде.
    Так заодно поймете, что я добавил.

    stepan 11 месяцев назад

    а можно без изменений самого шорткода, скажем, в том месте, где его вывод идет, задать условия проверки - "если в метабоксе стоит галочка и ID поста такой-то, то выводим шорткод"?

    можно наверное, все что хочешь можно.
    Я вопроса пока что не понял.
    Вникните в задачу - найдите решение.

    cazumbra 11 месяцев назад

    типа

    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 поста вообще непонятно...здесь вне цикла получается, и посты кастомного типа... или плохо ищу или что...

    stepan 11 месяцев назад

    Еще раз: под вашу задачу изменение шорткода ЕСТЬ обязательным.
    ИЛИ вы под каждый тип услуг делаете свой шорткод, что есть немного бред.
    Именно в шорткоде идет запрос в БД на выборку отзывов. в шорткоде идет вызвов функции get_posts()

    cazumbra 11 месяцев назад

    ну в общем, все нормально) как вы и сказали, создал метаполе на странице услуг, прописал туда ее ключ, и этот ключ подставил в ваш шорткод... поле скрыл, чтобы глаза не мозолило в админке и все. Вам спасибо за помощь! Пусть ваше имя отзовется в вечностиmosking Thanks!

    stepan 11 месяцев назад

    Ок, спасибо! (:
    Отмечайте вопрос решенным.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация