搜索热词

WordPress中文社区 > , , > WordPress搜索结果页分页出现404可能是这个原因

WordPress搜索结果页分页出现404可能是这个原因

发布于12月03日 被浏览 504 次

最近在给客户做一个包含多条件筛选的WordPress的主题的时候,搜索结果页还可以进行多条件筛选(配合搜索关键词),但是当搜索结果比较多出现分页的时候,问题出现了,点击筛选条件后再点击分页就出现404了,一开始想着会不会是伪静态的问题,发现不是,分页显示数量的问题?发现也不是,最后看网上都说handle_404()函数的问题,但是按照网上的方法去找,找到后发现这个函数和网上说的完全不同,可能是WordPress更新的原因,但是根据思路,然后自己修改了一下,发现可以了,所以,把方法记录下来。

首先,我看到的handle_404()函数是这样的(函数在:网站根目录\wp-includes\classe-wp.php):

public function handle_404() {
	global $wp_query;

	/**
	 * Filters whether to short-circuit default header status handling.
	 *
	 * Returning a non-false value from the filter will short-circuit the handling
	 * and return early.
	 *
	 * @since 4.5.0
	 *
	 * @param bool     $preempt  Whether to short-circuit default header status handling. Default false.
	 * @param WP_Query $wp_query WordPress Query object.
	 */
	if ( false !== apply_filters( 'pre_handle_404', false, $wp_query ) ) {
		return;
	}

	// If we've already issued a 404, bail.
	if ( is_404() ) {
		return;
	}

	// Never 404 for the admin, robots, or if we found posts.
	if ( is_admin() || is_robots() || $wp_query->posts ) {

		$success = true;
		if ( is_singular() ) {
			$p = false;

			if ( $wp_query->post instanceof WP_Post ) {
				$p = clone $wp_query->post;
			}

			// Only set X-Pingback for single posts that allow pings.
			if ( $p && pings_open( $p ) && ! headers_sent() ) {
				header( 'X-Pingback: ' . get_bloginfo( 'pingback_url', 'display' ) );
			}

			// check for paged content that exceeds the max number of pages
			$next = '<!--nextpage-->';
			if ( $p && false !== strpos( $p->post_content, $next ) && ! empty( $this->query_vars['page'] ) ) {
				$page    = trim( $this->query_vars['page'], '/' );
				$success = (int) $page <= ( substr_count( $p->post_content, $next ) + 1 );
			}
		}

		if ( $success ) {
			status_header( 200 );
			return;
		}
	}

	// We will 404 for paged queries, as no posts were found.
	if ( ! is_paged() ) {

		// Don't 404 for authors without posts as long as they matched an author on this site.
		$author = get_query_var( 'author' );
		if ( is_author() && is_numeric( $author ) && $author > 0 && is_user_member_of_blog( $author ) ) {
			status_header( 200 );
			return;
		}

		// Don't 404 for these queries if they matched an object.
		if ( ( is_tag() || is_category() || is_tax() || is_post_type_archive() ) && get_queried_object() ) {
			status_header( 200 );
			return;
		}

		// Don't 404 for these queries either.
		if ( is_home() || is_search() || is_feed() ) {
			status_header( 200 );
			return;
		}
	}

	// Guess it's time to 404.
	$wp_query->set_404();
	status_header( 404 );
	nocache_headers();
}

我们只需要把里面的if ( ! is_paged() ) {}这个if判断删除,然后把判断里的内容直接写出来就可以了。修改后的代码如下:

public function handle_404() {
	global $wp_query;

	/**
	 * Filters whether to short-circuit default header status handling.
	 *
	 * Returning a non-false value from the filter will short-circuit the handling
	 * and return early.
	 *
	 * @since 4.5.0
	 *
	 * @param bool     $preempt  Whether to short-circuit default header status handling. Default false.
	 * @param WP_Query $wp_query WordPress Query object.
	 */
	if ( false !== apply_filters( 'pre_handle_404', false, $wp_query ) ) {
		return;
	}

	// If we've already issued a 404, bail.
	if ( is_404() ) {
		return;
	}

	// Never 404 for the admin, robots, or if we found posts.
	if ( is_admin() || is_robots() || $wp_query->posts ) {

		$success = true;
		if ( is_singular() ) {
			$p = false;

			if ( $wp_query->post instanceof WP_Post ) {
				$p = clone $wp_query->post;
			}

			// Only set X-Pingback for single posts that allow pings.
			if ( $p && pings_open( $p ) && ! headers_sent() ) {
				header( 'X-Pingback: ' . get_bloginfo( 'pingback_url', 'display' ) );
			}

			// check for paged content that exceeds the max number of pages
			$next = '<!--nextpage-->';
			if ( $p && false !== strpos( $p->post_content, $next ) && ! empty( $this->query_vars['page'] ) ) {
				$page    = trim( $this->query_vars['page'], '/' );
				$success = (int) $page <= ( substr_count( $p->post_content, $next ) + 1 );
			}
		}

		if ( $success ) {
			status_header( 200 );
			return;
		}
	}

	// We will 404 for paged queries, as no posts were found.
	// Don't 404 for authors without posts as long as they matched an author on this site.
	$author = get_query_var( 'author' );
	if ( is_author() && is_numeric( $author ) && $author > 0 && is_user_member_of_blog( $author ) ) {
		status_header( 200 );
		return;
	}

	// Don't 404 for these queries if they matched an object.
	if ( ( is_tag() || is_category() || is_tax() || is_post_type_archive() ) && get_queried_object() ) {
		status_header( 200 );
		return;
	}

	// Don't 404 for these queries either.
	if ( is_home() || is_search() || is_feed() ) {
		status_header( 200 );
		return;
	}

	// Guess it's time to 404.
	$wp_query->set_404();
	status_header( 404 );
	nocache_headers();
}

不过这种方法修改的是核心文件,如果wordpress更新了那就又恢复了

点赞 收藏 打赏 分享

0 条评论

无意义的评论将很快被删除,账号将被禁止发言。 发表评论 0/500
 
  1. 还没有任何评论,你来说两句吧