Сustom с параметрами xfields и xfieldsexclude
При попытке вывести новости тегом {custom} с параметрами xfields и xfieldsexclude, например:
{custom xfields="2019,боевик" xfieldsexclude="Америка,Россия"}
движок все равно выведет новости с полями, в которых присутствуют слова из xfieldsexclude при условии, что так же в каком-либо поле содержится 2019. Наша же задача исключить вывод пересекающихся новостей через {custom}. То есть, если внесены определённые фразы в xfieldsexclude, то новости с их содержанием НЕ должны выводиться на сайте ни при каких обстоятельствах.
Установка:
1. Открыть engine/modules/functions.php и найти последнее вхождение:
if( preg_match( "#category=['\"](.+?)['\"]#i", $param_str, $match ) ) {
Добавить выше:
if( preg_match( "#senxf=['\"](.+?)['\"]#i", $param_str, $match ) ) {
if(count(explode("||", $match[1])) > 1)
{
$field = explode ("||", $match[1]);
$xf_where = array();
for($i = 0; $i < count($field); $i++)
{
$tmp_exp = explode ("|", $field[$i]);
$xf_where[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields, '" . trim($tmp_exp[0]) . "|', -1 ) , '||', 1 ) = '{$tmp_exp[1]}'";
}
$xf_where = implode (" AND ", $xf_where);
}
else
{
$field = explode ("|", $match[1]);
$xf_where = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields, '" . trim($field[0]) . "|', -1 ) , '||', 1 ) = '{$field[1]}'";
}
$where[] = $xf_where;
}
if( preg_match( "#selxf=['\"](.+?)['\"]#i", $param_str, $match ) ) {
if(count(explode("||", $match[1])) > 1)
{
$field = explode ("||", $match[1]);
$xf_where = array();
for($i = 0; $i < count($field); $i++)
{
$tmp_exp = explode ("|", $field[$i]);
$xf_where[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields, '" . trim($tmp_exp[0]) . "|', -1 ) , '||', 1 ) LIKE '%{$tmp_exp[1]}%'";
}
$xf_where = implode (" AND ", $xf_where);
}
else
{
$field = explode ("|", $match[1]);
$xf_where = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields, '" . trim($field[0]) . "|', -1 ) , '||', 1 ) LIKE '%{$field[1]}%'";
}
$where[] = $xf_where;
}
if( preg_match( "#notsenxf=['\"](.+?)['\"]#i", $param_str, $match ) ) {
if(count(explode("||", $match[1])) > 1)
{
$field = explode ("||", $match[1]);
$xf_where = array();
for($i = 0; $i < count($field); $i++)
{
$tmp_exp = explode ("|", $field[$i]);
$xf_where[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields, '" . trim($tmp_exp[0]) . "|', -1 ) , '||', 1 ) != '{$tmp_exp[1]}'";
}
$xf_where = implode (" AND ", $xf_where);
}
else
{
$field = explode ("|", $match[1]);
$xf_where = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields, '" . trim($field[0]) . "|', -1 ) , '||', 1 ) != '{$field[1]}'";
}
$where[] = $xf_where;
}
if( preg_match( "#notselxf=['\"](.+?)['\"]#i", $param_str, $match ) ) {
if(count(explode("||", $match[1])) > 1)
{
$field = explode ("||", $match[1]);
$xf_where = array();
for($i = 0; $i < count($field); $i++)
{
$tmp_exp = explode ("|", $field[$i]);
$xf_where[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields, '" . trim($tmp_exp[0]) . "|', -1 ) , '||', 1 ) NOT LIKE '%{$tmp_exp[1]}%'";
}
$xf_where = implode (" AND ", $xf_where);
}
else
{
$field = explode ("|", $match[1]);
$xf_where = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields, '" . trim($field[0]) . "|', -1 ) , '||', 1 ) NOT LIKE '%{$field[1]}%'";
}
$where[] = $xf_where;
}
Готово!
Использование:
- senxf - это поиск по доп полю с точным значением, например:
{custom senxf="year|2015"}
выведет все новости, которые имеют в доп.поле year значение 2015.
- selxf - это поиск по доп полю с возможным значением, например:
{custom selxf="ingredients|яйца||ingredients|рис"}
выведет все новости, которые имеют в доп.поле ingredients значение яйца и рис. То есть, эти значения могут быть где-то в середине текста этого поля (для этого и служит этот тег, если значение в поле одно, к примеру год, то используйте первый).
- notsenxf - обратное свойство параметра senxf
- notselxf - обратное свойство параметра selxf
• Автор: LazyDev
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.