Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Общие вопросы » Custom xfields, как сделать поиск по определенному доп.полю?

Custom xfields, как сделать поиск по определенному доп.полю?


     08.05.2017    Все вопросы » Общие вопросы    4510

вопрос
xfields выводятся все публикации, содержащие указанное в параметре значение дополнительных полей новостей. Допускается также перечисление значений в параметре через запятую. Например, при использовании {custom xfields="значение 1,значение 2"} будут выведены новости, в которых есть дополнительные поля содержащие "значение 1" или "значение 2".

Подскажите как сделать что бы {custom xfields="значение 1,значение 2"} значения искались только по определенному доп.полю? а не по всем полям что есть.

Ответил: PunPun


Открываем /engine/modules/functions.php файл ищем в функции custom_print следующий код:
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
Что бы задать несколько полей прописывать так:
название доп поля на латинице|значение поля||новое поле|значение нового поля

Автор: (с) Я

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

Гость
Юзер

Гость - 9 мая 2017 10:37 -

Спасибо за быстрый и качественный ответ. Можно добавить поддержку тега
{title}
? К сожалению не работает связка
{custom senxf="english|{title}"}
. В стандарте у меня работал тег
{title}  {custom  xfields="{title}" limit="10" order="reads" template="related" cache="no"}

Гость
Юзер

Гость - 9 мая 2017 11:10 -

Извиняюсь , за невнимательность мою))) все отлично работает в связке через selxf
{custom selxf="english|{title}"}
. еще раз спасибо за помощь

morefilms
Юзер

morefilms - 15 мая 2017 15:22 -

выведет все новости, имеют в доп поле ingredients значение яйца и рис

а если нужно вывести все новости, которые имеют в доп поле ingredients значение яйца или рис?

yeahga
Юзер

yeahga - 25 февраля 2018 18:14 -

Например, есть новости содержащие дополнительное поле такого вида:
A)
years|2011,2015,2017,2018||

И есть новости содержащие поле такого вида:
B)
years|2011201520172018||

А еще есть такие:
С)
years|2015||


{custom senxf="year|2015"} выведет С.
{custom selxf="year|2015"} выведет ABC

Вопрос: как вывести AC? Спасибо!

REDFLAME
Юзер

REDFLAME - 23 октября 2019 04:37 -

mne toje nada

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

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

наверх