Как изменить 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()) )); ?>
- /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()) )); ?>
- НЕ НУЖНО СДЕЛАТЬ ЭТИ ИЗМЕНЕНИЯ, ЕСЛИ ВЫ ДЕЛАЕТЕ ИЗМЕНЕНИЯ ИЗ ТОЧКИ 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 с сервера.
Поэтому я не могу изменить его, потому что у меня есть хост общего сервера, и провайдеры не будут его менять из-за этого.