Как изменить ft_min_word_len=4 на ft_min_word_len=1 так, чтобы osclass 3.7.1 мог искать не менее 1 символа слова вместо 4?

Я хочу изменить минимальную длину символа для поиска с 4 на 1.

Я нашел эту документацию https://doc.osclass.org/Fine-Tuning_MySQL_Full-Text_Search_-_Improving_search о osclass.

Дело в том, что из баз данных, которые я использую на своем хосте, только эта имеет ограничение в 4 символа, остальные имеют 0 или не установлены.

Так что мне нужно изменить это ft_min_word_len=4 to `ft_min_word_len=1'ТОЛЬКО в базе данных osclass.

Может ли кто-нибудь помочь с решением? У меня есть доступ к cpanel и phpMyAdmin

2 ответа

Решение

Оказывается, есть другой способ избежать изменения этой переменной.

Я пишу этот ответ здесь, потому что я не смог бы понять его самостоятельно без помощи других, которые делятся информацией на форумах ( https://forums.osclass.org/development/i-am-not-able-to-apply-a-regex-item-title/ или https://forums.osclass.org/general-help/brilliant-3-letter-word-search-is-possible!!!-read-this-tip/).

Итак, здесь идет 2 дня работы:

Идея состоит в том, чтобы отфильтровать заголовок и описание элементов перед их добавлением в базу данных. Этот фильтр должен добавить '_' для каждой буквы, отсутствующей в слове, содержащем менее 4 букв. Например: e___ ex__ exa_

Для этого нам понадобятся две функции: addunderline($t) и removeunderline($t)

Идея состоит в том, чтобы превратить все слова, содержащие не более 4 символов из названия, описания и шаблона поиска, в минимальные 4-значные слова, используя символы подчеркивания.

Итак, в базе данных будут слова типа "e___" и т. Д. Затем, когда информация отображается, мы используем функцию removeunderline.

Пожалуйста, сделайте резервную копию ваших файлов перед началом!!!

Следуй этим шагам

Для Osclass 3.7.1 и темы Bender:

Остановите и проанализируйте код перед его копированием. Я человек и ошибка может произойти, так как я сделал следующие инструкции после многих модификаций....

1. /oc-content/themes/bender/item-post.php

замещать

 <?php ItemForm::title_input('title',osc_current_user_locale(), osc_esc_html( bender_item_title() )); ?>

с

 <?php ItemForm::title_input('title',osc_current_user_locale(), osc_esc_html( removeunderline(bender_item_title()) )); ?>

а также

 <?php ItemForm::description_textarea('description',osc_current_user_locale(), osc_esc_html( bender_item_description() )); ?>

с

 <?php ItemForm::description_textarea('description',osc_current_user_locale(), osc_esc_html( removeunderline(bender_item_description()) )); ?>
  1. /oc-includes/osclass/gui/item-post.php

замещать

 <?php ItemForm::title_input('title',osc_current_user_locale(), osc_esc_html( bender_item_title() )); ?>

с

 <?php ItemForm::title_input('title',osc_current_user_locale(), osc_esc_html( removeunderline(bender_item_title()) )); ?>

а также

 <?php ItemForm::description_textarea('description',osc_current_user_locale(), osc_esc_html( bender_item_description() )); ?>

с

 <?php ItemForm::description_textarea('description',osc_current_user_locale(), osc_esc_html( removeunderline(bender_item_description()) )); ?>
  1. НЕ НУЖНО СДЕЛАТЬ ЭТИ ИЗМЕНЕНИЯ, ЕСЛИ ВЫ ДЕЛАЕТЕ ИЗМЕНЕНИЯ ИЗ ТОЧКИ 13!

/oc-content/themes/bender/item.php

замещать

 osc_item_title()

с

 removeunderline(osc_item_title())

а также

 osc_item_description()

с

 removeunderline(osc_item_description())

4. /oc-content/themes/bender/search.php

замещать

 if(osc_count_items() == 0) {?>
 <p class="empty" ><?php printf(__('There are no results matching "%s"', 'bender'), osc_search_pattern()) ; ?></p>

с

 if(osc_count_items() == 0) {?>
 <p class="empty" ><?php printf(__('There are no results matching "%s"', 'bender'), removeunderline(osc_search_pattern())); ?></p>

5. /oc-includes/osclass/helpers/hSearch.php

После:

 /**
  * Gets current search pattern
  *
  * @return string
  */
 function osc_search_pattern() {
     if(View::newInstance()->_exists('search_pattern')) {
         return View::newInstance()->_get('search_pattern');
     } else {
         return '';
     }
 }

Добавь это:

    /**
     * transforms all words with under 4 characters to 4 characters ones
     *
     * @return string
     */

 function addunderline($t)
 {
 if(count($t))
 {
  $words = explode(" ", $t);
  for ($i=0; $i<count($words); $i++)
  { $ln=strlen($words[$i]);
  if($ln==1)  $words[$i]=$words[$i].='___';
  if($ln==2)  $words[$i]=$words[$i].='__';
  if($ln==3)  $words[$i]=$words[$i].='_';
  }
  return implode(" ", $words);
 }
 else { return $t;
      }
 }

    /**
     * Removes '_' from the end of the 4 characters words
     *
     * @return string
     */
 function removeunderline($t)
 {
 if(count($t))
 {
  $words = explode(" ", $t);
  for ($i=0; $i<count($words); $i++)
  { 
    if(strlen($words[$i])==4)  $words[$i]=chop($words[$i],"_");

  }
  return implode(" ", $words);
 }
 else { return $t;
      }
 }

6. /oc-content/themes/bender/search-sidebar.php

замещать

 <input class="input-text" type="text" name="sPattern"  id="query" value="<?php echo osc_esc_html(osc_search_pattern()); ?>" />

с

 <input class="input-text" type="text" name="sPattern"  id="query" value="<?php echo removeunderline(osc_esc_html(osc_search_pattern())); ?>" />

7. /oc-includes/osclass/controller/search.php

замещать

 $p_sPattern   = trim(strip_tags(Params::getParam('sPattern')));

с

 $p_sPattern   = addunderline(trim(strip_tags(Params::getParam('sPattern'))));

8. /oc-content/themes/bender/functions.php

Добавить в конец файла (не оставлять пустых строк в конце файла)

 <?php
 function cust_filter_title_description($aItem) {

    foreach(@$aItem['title'] as $key => $value) {
        $aItem['title'][$key] = addunderline($value);
    }

    foreach(@$aItem['description'] as $key => $value) {
        $aItem['description'][$key] = addunderline($value);
    }

    return $aItem;
 }

 osc_add_filter('item_add_prepare_data', 'cust_filter_title_description');
 osc_add_filter('item_edit_prepare_data', 'cust_filter_title_description');
 ?>

9. /oc-includes/osclass/classes/Breadcrumb.php

замещать

 $pattern    = osc_search_pattern();

с

 $pattern    = removeunderline(osc_search_pattern());

НЕ НУЖНО СДЕЛАТЬ ЭТИ ИЗМЕНЕНИЯ [те, что указаны ниже с помощью osc_item_title()], ЕСЛИ ВЫ ДЕЛАЕТЕ ИЗМЕНЕНИЯ ИЗ ТОЧКИ 13!

и все

 osc_item_title()

с

 removeunderline(osc_item_title())

10. /oc-content/themes/bender/common/head.php

замещать

 <title><?php echo meta_title() ; ?></title>

с

 <title><?php echo removeunderline(meta_title()) ; ?></title>

11.НЕ НУЖНО СДЕЛАТЬ ЭТИ ИЗМЕНЕНИЯ, ЕСЛИ ВЫ ДЕЛАЕТЕ ИЗМЕНЕНИЯ ИЗ ТОЧКИ 13!

/oc-content/themes/bender/loop-single.php

Заменить все

 osc_item_title()

с

 removeunderline(osc_item_title())

а также

 osc_item_description()

с

 removeunderline(osc_item_description())

12.НЕ НУЖНО СДЕЛАТЬ ЭТИ ИЗМЕНЕНИЯ, ЕСЛИ ВЫ ДЕЛАЕТЕ ИЗМЕНЕНИЯ ИЗ ТОЧКИ 14!

/oc-content/themes/bender/loop-single-premium.php

замещать

 osc_premium_description()

с

 removeunderline(osc_premium_description())

и все

 osc_premium_title()

с

 removeunderline(osc_premium_title())

13. /oc-includes/osclass/helpers/hItems.php

замещать

 /**
 * Gets title from current item, if $locale is unspecified $locale is current user locale
 *
 * @param string $locale
 * @return string
 */
 function osc_item_title($locale = "") {
    if ($locale == "") $locale = osc_current_user_locale();
    $title = osc_item_field("s_title", $locale);
    if($title=='') {
        $title = osc_item_field("s_title", osc_language());
        if($title=='') {
            $aLocales = osc_get_locales();
            foreach($aLocales as $locale) {
                $title = osc_item_field("s_title", @$locale['pk_c_code']);
                if($title!='') {
                    break;
                }
            }
        }
    }
    return (string) $title;
 }

с

 /**
 * Gets title from current item, if $locale is unspecified $locale is current user locale
 *
 * @param string $locale
 * @return string
 */
 function osc_item_title($locale = "") {
    if ($locale == "") $locale = osc_current_user_locale();
    $title = osc_item_field("s_title", $locale);
    if($title=='') {
        $title = osc_item_field("s_title", osc_language());
        if($title=='') {
            $aLocales = osc_get_locales();
            foreach($aLocales as $locale) {
                $title = osc_item_field("s_title", @$locale['pk_c_code']);
                if($title!='') {
                    break;
                }
            }
        }
    }
    return (string) removeunderline($title);
 }

а также

 /**
 * Gets description from current item, if $locale is unspecified $locale is current user locale
 *
 * @param string $locale
 * @return string $desc
 */
 function osc_item_description($locale = "") {
    if ($locale == "") $locale = osc_current_user_locale();
    $desc = osc_item_field("s_description", $locale);
    if($desc=='') {
        $desc = osc_item_field("s_description", osc_language());
        if($desc=='') {
            $aLocales = osc_get_locales();
            foreach($aLocales as $locale) {
                $desc = osc_item_field("s_description", @$locale['pk_c_code']);
                if($desc!='') {
                    break;
                }
            }
        }
    }
    return (string) $desc;
 }

с

 /**
 * Gets description from current item, if $locale is unspecified $locale is current user locale
 *
 * @param string $locale
 * @return string $desc
 */
 function osc_item_description($locale = "") {
    if ($locale == "") $locale = osc_current_user_locale();
    $desc = osc_item_field("s_description", $locale);
    if($desc=='') {
        $desc = osc_item_field("s_description", osc_language());
        if($desc=='') {
            $aLocales = osc_get_locales();
            foreach($aLocales as $locale) {
                $desc = osc_item_field("s_description", @$locale['pk_c_code']);
                if($desc!='') {
                    break;
                }
            }
        }
    }
    return (string) removeunderline($desc);
 }

14. /oc-includes/osclass/helpers/hPremium.php

замещать

 /**
 * Gets title from current premium, if $locale is unspecified $locale is current user locale
 *
 * @param string $locale
 * @return string
 */
 function osc_premium_title($locale = "") {
    if ($locale == "") $locale = osc_current_user_locale();
    $title = osc_premium_field("s_title", $locale);
    if($title=='') {
        $title = osc_premium_field("s_title", osc_language());
        if($title=='') {
            $aLocales = osc_get_locales();
            foreach($aLocales as $locale) {
                $title = osc_premium_field("s_title", $locale);
                if($title!='') {
                    break;
                }
            }
        }
    }
    return (string) $title;
 }

с

 /**
 * Gets title from current premium, if $locale is unspecified $locale is current user locale
 *
 * @param string $locale
 * @return string
 */
 function osc_premium_title($locale = "") {
    if ($locale == "") $locale = osc_current_user_locale();
    $title = osc_premium_field("s_title", $locale);
    if($title=='') {
        $title = osc_premium_field("s_title", osc_language());
        if($title=='') {
            $aLocales = osc_get_locales();
            foreach($aLocales as $locale) {
                $title = osc_premium_field("s_title", $locale);
                if($title!='') {
                    break;
                }
            }
        }
    }
    return (string) removeunderline($title);
 }

а также

 /**
 * Gets description from current premium, if $locale is unspecified $locale is current user locale
 *
 * @param string $locale
 * @return string $desc
 */
 function osc_premium_description($locale = "") {
    if ($locale == "") $locale = osc_current_user_locale();
    $desc = osc_premium_field("s_description", $locale);
    if($desc=='') {
        $desc = osc_premium_field("s_description", osc_language());
        if($desc=='') {
            $aLocales = osc_get_locales();
            foreach($aLocales as $locale) {
                $desc = osc_premium_field("s_description", $locale);
                if($desc!='') {
                    break;
                }
            }
        }
    }
    return (string) $desc;
 }

с

 /**
 * Gets description from current premium, if $locale is unspecified $locale is current user locale
 *
 * @param string $locale
 * @return string $desc
 */
 function osc_premium_description($locale = "") {
    if ($locale == "") $locale = osc_current_user_locale();
    $desc = osc_premium_field("s_description", $locale);
    if($desc=='') {
        $desc = osc_premium_field("s_description", osc_language());
        if($desc=='') {
            $aLocales = osc_get_locales();
            foreach($aLocales as $locale) {
                $desc = osc_premium_field("s_description", $locale);
                if($desc!='') {
                    break;
                }
            }
        }
    }
    return (string) removeunderline($desc);
 }

Конец.

Теперь вы должны отредактировать и сохранить все списки со своего веб-сайта или подождать, пока все списки будут отредактированы и сохранены их авторами (или заново создать таблицы полнотекстового поиска в БД - подробности об этом можно найти в Интернете).

Обсервованный Это позволяет: - URL-адреса, item_titles и item_description остаются с подчеркиванием в автоматически сгенерированных электронных письмах, - URL-адреса остаются с подчеркиванием в SEO-дружественных URL-адресах - item_title и item_description остаются с подчеркиванием в административной области osclass (только для администратора, но не для зарегистрированных пользователей). - слова, такие как bmw x5, становятся bmw_ x5,_ в базе данных, поэтому вам нужно внести изменения, чтобы добавить и удалить функции подчеркивания для решения проблемы пунктуации, без использования символов <> в регулярном выражении, поскольку osclass преобразует их в < ; и>; и если элемент редактируется и сохраняется, эти символы умножаются с каждым действием редактирования-сохранения. Я решил это с помощью обс. для пользователей не использовать символы <>.

РЕДАКТИРОВАТЬ.

Ссылка на элемент может быть решена следующим образом:

/oc-includes/osclass/helpers/hDefines.php

положил

 $url = str_replace('{ITEM_TITLE}', osc_sanitizeString(removeunderline($item['s_title'])), $url);

вместо

 $url = str_replace('{ITEM_TITLE}', osc_sanitizeString($item['s_title']), $url);

Для {ITEM_TITLE} и {ITEM_DESCRIPTION}:

/oc-includes/osclass/emails.php

Поместите removeunderline() в значения {ITEM_TITLE} и {ITEM_DESCRIPTION}.

Пример:

 $words   = array();
    $words[] = array(
        '{ITEM_DESCRIPTION_ALL_LANGUAGES}',
        '{ITEM_DESCRIPTION}',
        '{ITEM_COUNTRY}',
        '{ITEM_PRICE}',
        '{ITEM_REGION}',
        '{ITEM_CITY}',
        '{ITEM_ID}',
        '{USER_NAME}',
        '{USER_EMAIL}',
        '{ITEM_TITLE}',
        '{ITEM_URL}',
        '{ITEM_LINK}',
        '{VALIDATION_LINK}',
        '{VALIDATION_URL}',
        '{EDIT_LINK}',
        '{EDIT_URL}',
        '{DELETE_LINK}',
        '{DELETE_URL}'
    );
    $words[] = array(
        $all,
        removeunderline($item['s_description']), // here
        $item['s_country'],
        osc_format_price($item['i_price']),
        $item['s_region'],
        $item['s_city'],
        $item['pk_i_id'],
        $item['s_contact_name'],
        $item['s_contact_email'],
        removeunderline($item['s_title']), // here
        $item_url,
        $item_link,
        '<a href="' . $validation_url . '" >' . $validation_url . '</a>',
        $validation_url,
        '<a href="' . $edit_url . '">' . $edit_url . '</a>',
        $edit_url,
        '<a href="' . $delete_url . '">' . $delete_url . '</a>',
        $delete_url
    );

Сделайте то же самое для всех {ITEM_TITLE} в этом файле (10 замен).

Сделайте то же самое для всех {ITEM_DESCRIPTION} в этом файле (3 замены).

Оказывается, что из моих скриптов только osclass использует эту переменную ft_min_word_len=4 с сервера.

Поэтому я не могу изменить его, потому что у меня есть хост общего сервера, и провайдеры не будут его менять из-за этого.

Другие вопросы по тегам