搜索html标记时出现的WordPress搜索问题

时间:2014-09-01 作者:Pramod Sivadas

我正在wordpress网站上工作,我正在使用wordpress本机搜索。当我们搜索类似“example”的字符串时,它会在html标记中进行搜索。ie如果有任何html标记,如<a href="http://example.com"> 在页面或帖子中,搜索结果将显示特定页面或帖子。我不想在html标记内搜索。

我已经试过使用插件了Search Exclude HTML Tags 但它使用的是MySql存储函数,这对我来说并不适用。我想这可能是我的mysql用户许可的问题。

是否有其他方法解决此问题。

感谢斯普拉莫德

2 个回复
最合适的回答,由SO网友:Pramod Sivadas 整理而成

我为此创建了一个小插件:)并修复了该问题。

https://wordpress.org/plugins/wp-search-ignore-html-tags/

只有一行或两行代码。在大多数情况下都有效。

SO网友:bonger

您可以尝试使用多个regexp仅在尖括号外搜索:

function wpse159789_posts_search( $search, $query ) {
    global $wpdb;
    if ( ! preg_match( \'/\' . $wpdb->posts . \'\\.post_content LIKE \\\'%(.+)%\\\'/\', $search, $matches, PREG_OFFSET_CAPTURE ) ) {
        return $search;
    }
    $search_str = stripslashes( $matches[1][0] );
    // Cater for closed angle pairs embedded in the search string.
    for ( $i = 0, $len = mb_strlen( $search_str ); $i < $len; $i++ ) {
        $q_searches[] = \'(<[^>]*>)?\' . preg_quote( mb_substr( $search_str, $i, 1 ) );
    }
    $q_search = implode( \'\', $q_searches );
    $regexs[] = \'^[^<]*\' . $q_search; // Before any angle bracket.
    $regexs[] = \'(<[^>]*>)[^<]*\' . $q_search; // After any closed angle bracket pair.
    array_unshift( $regexs, implode( \' OR \', array_fill( 0, count( $regexs ), $wpdb->posts . \'.post_content RLIKE %s\' ) ) );
    $search_replace = call_user_func_array( array( $wpdb, \'prepare\' ), $regexs );
    $search = substr( $search, 0, $matches[0][1] ) . $search_replace . substr( $search, $matches[0][1] + strlen( $matches[0][0] ) );
    return $search;
}
我不确定这是否涵盖所有情况,但似乎对有限的测试有效。。。(如果MySQL regexp支持“向后看/向前看”,则会简单得多)。

结束

相关推荐

CPT Meta Searching

我正在开发一个使用自定义帖子类型和元数据的WP插件。我试图实现的是元数据的可搜索性。下面是我找到的一些可以很好地搜索元数据的代码,但是我无法让它在CPT页面上显示搜索字符串。add_filter( \"pre_get_posts\", \"custom_search_query\"); function custom_search_query( $query ) { $custom_fields = array( \"pctracker_company\",