Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Хаки » Как изменить вывод custom по нескольким тегам?

Как изменить вывод custom по нескольким тегам?


     24.06.2019    Все вопросы » Хаки    1027

вопрос
Здравствуйте, {custom tags="новости,шаблоны"} выведет все новости, которые содержат ключевые слова из облака тегов "новости" и "шаблоны".
Как сделать, чтобы выводило только те новости, у которых не один из этих, а оба эти тега присутствуют одновременно?

Ответил: LazyDev


Открыть файл /engine/modules/functions.php найти код
if( preg_match( "#tags=['\"](.+?)['\"]#i", $param_str, $match ) ) {
Выше вставить
if (preg_match("#and-tags=['\"](.+?)['\"]#i", $param_str, $match)) {
	$tempArray = [];
	$match[1] = explode(',', trim($match[1]));
	$oldMySQL = version_compare($db->mysql_version, '5.5.3', '<') == 1 ? false : true;
	
	foreach ($match[1] as $value) {
		$value = $db->safesql(trim($value));
		if ($value) {
			if ($oldMySQL) {
				$tempArray[] = "tags REGEXP '[[:<:]](" . $value  . ")[[:>:]]'";
			} else {
				$tempArray[] = "tags REGEXP '([[:punct:]]|^)(" . $value . ")([[:punct:]]|$)'";
			}
		}
	}
	
	if ($tempArray) {
		$where[] = implode(' AND ', $tempArray);
	}
	unset($tempArray);
}

В {custom} использовать
and-tags="тег,кофе"

6 комментариев

Mau
Юзер

Mau - 24 июня 2019 21:35 -

Как я понимаю, нужно править engine/modules/functions.php?

if( preg_match( "#tags=['\"](.+?)['\"]#i", $param_str, $match ) ) {

			$temp_array = array();
			
			$match[1] = explode (',', trim($match[1]));
			
			foreach ($match[1] as $value) {
				$value = $db->safesql(trim($value));
				if( $value ) $temp_array[] = "tag='{$value}'";
			}
			
			if ( count($temp_array) ) {
	
				$temp_array = implode(" OR ", $temp_array);
				
				$db->query ( "SELECT news_id FROM " . PREFIX . "_tags WHERE {$temp_array}" );

				$temp_array = array ();
				
				while ( $row = $db->get_row () ) {
					
					if (!in_array($row['news_id'], $temp_array)) $temp_array[] = $row['news_id'];
				
				}
				
				if (count ( $temp_array )) {
					
					$where[] = "id IN ('" . implode("','", $temp_array) . "')";
				
				} else $where[] = "id IN ('0')";
				
			}
			
		}

Mau
Юзер

Mau - 24 июня 2019 23:47 -

Спасибо, скажите, а эту строчку можно изменять? Похоже из-за нее отказывается правильно работать.
$oldMySQL = version_compare($db->mysql_version, '5.5.3', '<');

LazyDev
PHP-developer

LazyDev - 24 июня 2019 23:55 -

Mau,
1. Скиньте свой код custom.
2. Что значит отказывается правильно работать?

Мой блог: LazyDev.pro

Помогаю с решением проблем на платной основе.

Mau
Юзер

Mau - 25 июня 2019 00:12 -

{custom available="global" sort="desk" cache="yes" and-tags="чай,кофе,шоколад"}
, когда я вывожу один тег - "чай", показывается всего одна новость, хотя их три, а если прописать несколько тегов сразу, как выше, то вообще ничего не показывает, хотя новости, где прописаны все три тега присутствуют.
В этой строчке сменил знак '<' на '>' и все стало работать как надо.
$oldMySQL = version_compare($db->mysql_version, '5.5.3', '<');

LazyDev
PHP-developer

LazyDev - 25 июня 2019 00:28 -

Mau, Замените
$oldMySQL = version_compare($db->mysql_version, '5.5.3', '<');
На
$oldMySQL = version_compare($db->mysql_version, '5.5.3', '<') == 1 ? false : true;

Мой блог: LazyDev.pro

Помогаю с решением проблем на платной основе.

Mau
Юзер

Mau - 25 июня 2019 00:34 -

Спасибо еще раз, все работает!

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх