Tạo Custom Page Template dựa vào Url Rewrite

Có bao giờ bạn tự hỏi sẽ tạo Rewrite  URL  trên WordPress một cách tùy ý? Ở đây, tôi đã đối mặt với một vấn đề thú vị như vậy. Tôi muốn thêm một Rewrite rule trên một Permalink và muốn sử dụng một custom template cho Rewrite rule. Tuy nhiên, đây không phải là một bài viết đầy đủ về cách làm Rewrite rule, tôi sẽ hướng dẫn cho các bạn một cách chi tiết về:
Mục tiêu bài viết hôm nay:

  • Thêm một Rewrite rule trên bài viết với custom permalink .
  • Sử dụng page template dựa trên các Rewrite rule.

Ở đây, chúng ta có một dạng “moive”. Cấu trúc permalink là "movie/{movie-name}". Tôi muốn thêm vào trên URL endpoint là “photos” và “videos”, vì vậy cấu trúc sẽ là "movie/{movie-name}/photos""movie/{movie-name}/videos". Như bạn có thể đoán, tôi muốn hiển thị tất cả các hình ảnh và video trên một trang riêng biệt từ movie đó và muốn sử dụng page template riêng để thực hiện điều này.

1. Đăng ký tùy ý URL

function prefix_movie_rewrite_rule () {
	add_rewrite_rule ( 'movie/([^ /] +)/photo','?index.php&movie=$params[1]&photo=yes', 'top');
	add_rewrite_rule ( 'movie/([^ /] +)/video','?index.php&movie=$params[1]&video=yes', 'top');
}
add_action ( 'init', 'prefix_movie_rewrite_rule');

Bằng công thức "add_rewrite_rule", chúng ta có thêm hai custom rewrite rule trên các URL và đặt hai query variables (query var) vào URL. Tôi không sử dụng “add_rewrite_endpoint” bởi vì tôi không muốn thêm endpoint này đến từng permalink tôi có. Nhưng chỉ thêm rewrite rule này, chúng sẽ không làm việc và WordPress sẽ từ chối chúng bởi vì nó không nhận ra những query var, chúng ta thêm vào thông qua custom rewrite rule của chúng ta. Chúng ta phải nói WordPress khá khiêm tốn trên các query var.

2. Đăng ký các Query Var

function prefix_register_query_var ($ vars) {
	$ Vars [] = 'photo';
	$ Vars [] = 'video';

	return $ vars;
}
add_filter ( 'query_vars', 'prefix_register_query_var');

Bây giờ, như chúng ta đã thêm những query cho WordPress, nó sẽ nhận ra chúng và chúng ta có thể tận dụng lợi thế của chúng. Nhưng nếu bạn đi đến URL "movie/{movie-name}/photos", bạn vẫn sẽ thấy rằng những template single-movie.php hoặc single.php đang quan tâm đến các URL này. Nếu bạn thấy 404 lỗi trên custom URL, đừng lo, chỉ cần lưu permalinks của bạn một lần nữa.

3. Thiết lập Template:

prefix_url_rewrite_templates function () {
	if (get_query_var ( 'hình ảnh') && is_singular ( 'phim')) {
		add_filter ( 'template_include', function () {
		return get_template_directory (). '/single-movie-image.php';
		});
	}

	if (get_query_var (video '') && is_singular ( 'phim')) {
		add_filter ( 'template_include', function () {
		return get_template_directory (). '/single-movie-video.php';
		});
	}
}

add_action ( 'template_redirect', 'prefix_url_rewrite_templates');

Ở đây chúng ta đang nói rằng, nếu có một query var “photos” hoặc “videos” và đó là một trang “movie” duy nhất, chúng ta đang thiết lập các template như "single-movie-image.php""single-movie-video.php" tương ứng.

Vì vậy, "single-movie-image.php" chịu trách nhiệm cho query "movie/{movie-name}/photos""single-phim-video.php" chịu trách nhiệm cho query "movie/{movie-name}/videos". Đơn giản không?

Thêm lưu ý: Trong phần tạo custom page template này, chúng ta đang sử dụng chức năng ẩn danh PHP. Vì vậy, mã code này sẽ cần tối thiểu PHP 5.3.0 để hỗ trợ hoặc bạn có thể sử dụng các bộ lọc theo cách cũ. Một điều cần nhớ khi sử dụng chức năng ẩn danh là bạn không thể hủy đăng ký một bộ lọc hoặc hành động như thường lệ. Nhưng đó là một cách dễ dàng để ràng buộc một hành động hoặc bộ lọc mà không cho các chức năng một tên.

Nguồn: Tareq Hasan


Leave a Reply

Your email address will not be published. Required fields are marked *

×