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

Поиск для плейлиста

Доброго дня!

Хочу реализовать поиск для сайта по названию трека в плейлисте.
Так как плейлист выводиться стандартным шорткодом wp. То названия не могут захватиться поиском.
Лучшим решением думаю будет прописать названия в метаполе записи. Но не знаю как скормить это в серч куэри.

Буду рад вашим комментам.

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

function content_search($text) {
	$id = get_the_ID();
	if( isset( $_GET['search'] ) )  {
		$start = true;
		if( isset( $_GET['id'] ) ) {
			if( $id != $_GET['id'] ) {
				$start = false;
			} else {
				nocache_headers();
			}
		}
		if( $start ) {
			$return_url = esc_url( wp_get_referer() );
			if( $return_url ) {
				$var = wp_parse_url($return_url, PHP_URL_QUERY);
				if( substr($var, 0, 2) == 's=' ) {
					$search = urldecode(mb_substr($var, 2, (mb_strlen($var) - 2)));
					if( $search ) {
						$temp = wp_strip_all_tags($text);
						if( mb_stripos($temp, $search) !== false ) {
							$text = preg_replace( '#(' . preg_quote($search) . ')#uis', '<mark id="search">$1</mark>', $text, 1 );
						}
					}
				}
			}
		}
	}
	return $text;
}
0
mi13
2 месяца назад 75
  • 2
    Dan Zakirov525 air-wp.com

    Так как плейлист выводиться стандартным шорткодом wp. То названия не могут захватиться поиском.

    Могут... модифицируйте шорткод или другие решения по любому есть, надо на месте смотреть.

    Ниже я даю код, я не говорю что он рабочий, просто в качестве примера как скормить. Проверял на отдельном пост тайпе

    function content_search($text) {
    	$id = get_the_ID();
    
    	if (isset($_GET['search'])) {
    		$start = true;
    
    		if (isset($_GET['id']) && $id != $_GET['id']) {
    			$start = false;
    		} else {
    			nocache_headers();
    		}
    
    		if ($start) {
    			$return_url = esc_url(wp_get_referer());
    
    			if ($return_url) {
    				$var = wp_parse_url($return_url, PHP_URL_QUERY);
    
    				if (substr($var, 0, 2) === 's=') {
    					$search = urldecode(mb_substr($var, 2));
    
    					if ($search) {
    						$temp = wp_strip_all_tags($text);
    
    						if (mb_stripos($temp, $search) !== false) {
    							$text = preg_replace('#(' . preg_quote($search) . ')#uis', '<mark id="search">$1</mark>', $text, 1);
    						} else {
    							// Если название трека не найдено в содержимом, то ищем в метаполях
    							$meta_query = array(
    								'relation' => 'OR',
    								array(
    									'key'     => 'random_meta_key', // тут 'random_meta_key' пилим свой ключ
    									'value'   => $search,
    									'compare' => 'LIKE',
    								),
    							);
    							$query = new WP_Query(array('meta_query' => $meta_query));
    
    							if ($query->have_posts()) {
    								$text = '';
    
    								while ($query->have_posts()) {
    									$query->the_post();
    									$text .= get_the_title() . '<br>';
    								}
    
    								wp_reset_postdata();
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    
    	return $text;
    }
    mi13 2 месяца назад

    Интересное решение!

    Тоже самое можно закинуть в add_filter('pre_get_posts','SearchFilter');, но оно будет работать по принципу если нет результатов поиска, то ищем в мета полях, что не совсем удачное решение. Спасибо за ответ )

    А код выше у меня в add_filter( 'the_content'.. где search говорит что мы перешли в статью со страницы результатов поиска, а $id говорит что мы перешли в кастомную страницу со страницы результатов и нам нужно подсветить слово в куске страницы найдя его по $id.

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