修改WordPress搜索页网址格式的方法

WordPress默认搜索结果的网址结构为:https://www.zhuige.com/?s=关键词,为了url更美观,也利于seo,我们可以改成:https://www.zhuige.com/search/搜索词。

在当前使用的WordPress模板functions.php中添加以下代码即可:

/*
* 修改搜索结果页网址结构
*/
function zhuige_change_search_url_rewrite() {
    if ( is_search() && ! empty( $_GET['s'] ) ) {
        wp_redirect( home_url( "/search/" ) . urlencode( get_query_var( 's' ) ) );
        exit();
    }   
}
add_action( 'template_redirect', 'zhuige_change_search_url_rewrite' );

 

 

WordPress实现搜索到某个指定关键词就跳到指定文章页面

想对指定搜索关键词进行更好的结果显示聚合,可能会需要把搜索结果页跳转到指定的归档页面,那么如何实现呢?

下面代码放入到主题的function.php文件中:

代码里的$epd_game_search是一个数组,你预先设定好关键词以及对应跳转地址即可。

function mobantu_search_jump( $query, $error = true ) {
	if (is_search() && !is_admin()) {
		$jump = 0;$url = '';
		$epd_game_search = get_option('epd_game_search');
		if($epd_game_search){
			$cnt = count($epd_game_search['buy']);
			for($i=0; $i<$cnt;$i++){ 
				if( strpos($query->query['s'], $epd_game_search['buy'][$i]) !== false ){
					$jump = 1;
					$url = $epd_game_search['get'][$i];
					break;
				}
			}
		}

		if($jump==1){
			$query->is_search = false;
			$query->query_vars['s'] = false;
			$query->query['s'] = false;
			if ( $error == true ){
				// $query->is_404 = true;
				echo '<html>
				<script>
					location.href = "'.$url.'";
				</script>

				</html>';
				exit;
			}
		}
	}
}
add_action( 'parse_query', 'mobantu_search_jump' );

 

 

WordPress修改默认搜索参数s,$_GET[‘s’],防范垃圾营销恶意访问

最近几天,博客一直被垃圾营销攻击,一直通过/?s=xxxx 搜索接口进行大量的营销搜索,如果只是偶尔来一次,我还能忍受,玩玩没想到,这种垃圾营销到了晚上就是一直循环访问,以至于我的服务器被运营商判定为被CC攻击了,然后服务器IP地址被间歇性封停,不过也只能说某安的云空间确实LJ,我转到阿里云之后一点问题都没有,同样的价格还是用大厂商的服务器吧 。

通过服务器日志,可以看到,这种垃圾营销主要是推广QQ、微信、APP之类的,如图所示,这些%开头的字符串是URL编码,你可以通过JS的 decodeURI 或者PHP的 urldecode 函数进行解码,毋庸置疑,这些解码后的结果都是如出一辙的垃圾营销。

这些s后的参数,是URL编码,JS通过decodeURI,PHP通过urldecode可以解析

刚开始看到这些个东西的时候,还想着把百度云加速的CC防御拉大吧(LZ用的是免费版本的云加速),结果还是有这些垃圾营销。想了想,这些垃圾营销攻击实际上只是探测到了我是WordPress,就会一直使用WordPress的s搜索参数搞事情,如果我修改了WordPress的默认搜索参数,会不会能够解决(因为搜索耗费的服务器资源是比较大的)。经过一番查找,我找到了一个方案(如果你使用此方案,你需要对你的主题搜索文件中的默认s搜索参数进行修改),LZ是一个WordPess的白痴,如果说错了,请见谅。

这里我要说一下,我翻阅了WordPress的代码,似乎WordPress中的搜索参数是写死的,就是s参数。我并不想去更改WordPress的核心代码,因为我未来还会继续更新WordPress。因此我给出的方案是:

  •  用户前端传入一个自定义的搜索参数,例如是sk,我们在后台处理中检测一下这个参数,如果存在,那么就在WordPress的参数中增加一个s参数,这样WordPress的处理流程中依然会认为s参数存在,就会进行搜索处理;
  •  如果前端传入的参数中包含了s参数,那么我们就可以判定,这个搜索并不是正常的,因为我们前端的搜索表单中已经修改了搜索的参数是sk了,此时就可以忽略掉,或者进行其他的奇怪的处理,嘿嘿嘿

解决方案:

打开你的主题functions.php文件,我们增加两个filter, query_vars 和 request , 有人会问为什么不用 parse_query 这个filter,很可惜,我翻阅了代码, parse_query 这个filter会在WP_Query->parse_query 调用之后才进行处理,此时的参数已经解析完成了,并且 is_search 已经被确定了,我这里使用 request 的目的就是想要更提前的处理;同时,为了保证WordPress不回过滤掉我们的自定义参数sk,我们需要在query_vars 中告知WordPress这个自定义的参数sk,这样WordPress在处理参数的时候就会保留这个sk。代码处理如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
define('DEFAULT_QUERY_PARAMTER','s');   //默认搜索关键字,区分大小写
define('SELF_FRONT_QUERY_PARAMTER','sk');//自定义的搜搜参数sk
//允许,自定义的查询关键字,否则,前台自定义的关键字会被过滤掉
add_filter('query_vars',function($vars){
    //只针对前台
    if(!is_admin()){
        $vars[] = SELF_FRONT_QUERY_PARAMTER;
    }
    return $vars;
});
add_filter('request'function($search_vars){
    //后台的请求,依然通过s,不用处理
        //前端用户的正常搜索,就看看是不是自定义的参数
    if(!is_admin()){
        if(isset($search_vars[DEFAULT_QUERY_PARAMTER])){
            http_response_code(503);
            die();
        }
        //如果存在自定义的搜索,更换为s参数
        if(isset($search_vars[SELF_FRONT_QUERY_PARAMTER])){
            $search_vars[DEFAULT_QUERY_PARAMTER] = $search_vars[SELF_FRONT_QUERY_PARAMTER];
        }
    }
    return $search_vars;
});

通过,上面的操作,我们的搜索请求只会接受sk这个自定义的参数,由于我们的搜索是在主题的搜索表单中提供的表单域的,因此我们需要对主题中的搜索框所在的表单中的搜索关键字的name值进行修改,例如这里我使用的是欲思主题,他的搜搜表单位于主题文件件下的header.php文件中,如图所示。

这个name值原始是name=”s”

OK ,完成之后,再去试试你的搜索吧,是不是使用sk就生效了,使用s参数就会503了。

 

 

 

参考推荐:

WordPress 自带搜索恶意攻击防御方法

WordPress 搜索结果中排除特定的页面、文章和分类