如何将 ft_min_word_len=4 修改为 ft_min_word_len=1 以便 osclass 3.7.1 可以搜索最少 1 个字符的单词,而不是 4 个?

How to modify ft_min_word_len=4 to ft_min_word_len=1 so that osclass 3.7.1 can search min 1 character word, instead of 4?

我想将搜索的最小字符长度从 4 更改为 1。

我找到了这个关于 osclass 的文档https://doc.osclass.org/Fine-Tuning_MySQL_Full-Text_Search_-_Improving_search

问题是,从我在主机上使用的数据库来看,只有这个有 4 个字符的限制,其余的都是 0 或未设置。

所以我只需要在 osclass 数据库中将 ft_min_word_len=4 修改为 `ft_min_word_len=1'。

有人可以帮忙解决吗?我可以访问 cpanel 和 phpMyAdmin

事实证明,从我的脚本来看,只有 osclass 使用来自服务器的这个 ft_min_word_len=4 变量。

所以我无法更改它,因为我有一个共享服务器主机,并且提供商不会因此更改它。

事实证明还有另一种方法可以避免更改此变量。

我在这里写下这个答案是因为如果没有其他人在论坛上分享信息的帮助 (https://forums.osclass.org/development/i-am-not-able-to-apply-a-regex-item-title/ or https://forums.osclass.org/general-help/brilliant-3-letter-word-search-is-possible!!!-read-this-tip/),我将无法自己弄清楚它 (https://forums.osclass.org/development/i-am-not-able-to-apply-a-regex-item-title/ or https://forums.osclass.org/general-help/brilliant-3-letter-word-search-is-possible!!!-read-this-tip/)。

所以这是 2 天的工作:

想法是在将项目添加到数据库之前过滤项目的标题和描述。此过滤器必须为少于 4 个字母的单词中缺少的每个字母添加“_”。 例如: e___ ex__ exa_

为此,我们需要 2 个函数: 添加下划线($t) 和删除下划线($t)

想法是将所有少于 4 个字符的单词从标题、描述和搜索模式中转换为使用下划线字符的最少 4 个字符的单词。

所以,在数据库中会有"e___"等词。 然后,当显示信息时,我们使用 removeunderline 函数。

请在开始前为您的文件做一个back-up!!!

按照以下步骤操作

对于 Osclass 3.7.1 和 Bender 主题:

停止并分析 copy-pasting 之前的代码。我是一个人,可能会发生错误,因为我在多次修改后做出了以下说明....

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());

如果您根据第 13 点进行修改,则无需进行这些更改[下面带有 osc_item_title()] 的更改!

和全部

 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.NO 如果您对第 13 点进行了修改,则需要进行这些更改!

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

全部替换

 osc_item_title()

 removeunderline(osc_item_title())

 osc_item_description()

 removeunderline(osc_item_description())

12.NO 如果您对第 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 在自动生成的电子邮件中保留下划线, - 网址在 seo 友好的网址中保留下划线 - item_title 和 item_description 在 osclass 管理区域中保留下划线(仅适用于管理员,不适用于登录用户)。 -像bmw x5这样的词,在数据库中变成了bmw_ x5,_,所以需要修改加减下划线功能来解决标点符号问题,不要在正则表达式中使用<>字符,因为osclass将它们转化为<; >;如果项目被编辑和保存,这些字符会随着每个 edit-save 操作而倍增。我用obs解决了这个问题。对于不使用 <> 字符的用户。

编辑。

项目link可以这样解决:

/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 个替换)。