Có một lỗi cốt lõi WordPress tồn tại lâu dài ( # 16373 ), trong đó, nếu các biến truy vấn tùy chỉnh được đăng ký và hiện trong chuỗi truy vấn, truy vấn sẽ không được đặt thành is_front_page()
đúng, ngay cả khi 'page' == get_option( 'show_on_front' )
. Chi tiết đầy đủ có trong vé trac, nhưng kết quả cuối cùng là trang trước trả về một trang không hợp lệ thay vì get_option( 'page_on_front' )
.
Tôi có một trường hợp sử dụng nhất định trong đó tôi cần chuyển các biến truy vấn tùy chỉnh cho chuỗi truy vấn trên trang trước (sử dụng biểu mẫu để chuyển các biến truy vấn đã đăng ký, lần lượt được sử dụng để lọc tùy chọn Chủ đề - bản demo tùy chọn Chủ đề phía trước ). Vé trac đã đề cập ở trên đã bị đóng là không hợp lệ, vì vậy tôi cần một cách giải quyết.
Tôi có thể buộc mẫu trang trước đủ dễ dàng, như vậy:
function themeslug_force_front_page_template( $template ) {
if ( '' != get_query_var( 'foobar' ) ) { // Registered custom query var
return get_front_page_template();
}
return $template;
}
add_filter( 'template_include', 'themeslug_force_front_page_template' );
Tuy nhiên, các điều kiện truy vấn cơ bản không bị ảnh hưởng. Vì vậy, bất kỳ mã nào phụ thuộc vào is_front_page()
việc true
(chẳng hạn như một thanh trượt chỉ hiển thị trên trang đầu của trang) sẽ vẫn không hiển thị đúng.
Tôi đã cố gắng sửa đổi $query
tại pre_get_posts
, nhưng điều này dường như không hoạt động:
function themeslug_force_static_front_page( $query ) {
if ( $query->is_main_query() ) {
if ( 'page' == get_option( 'show_on_front' ) ) {
if ( '' != get_query_var( 'foobar' ) ) { // Registered custom query var
$query->set( 'page_id', get_option( 'page_on_front' ) );
$query->set( 'is_home', false );
$query->set( 'is_page', true );
$query->set( 'is_front_page', true );
}
}
}
}
add_action( 'pre_get_posts', 'themeslug_force_static_front_page' );
Các điều kiện truy vấn không được sửa đổi. Tôi đang cố gắng không chính xác trong cuộc gọi lại của tôi? Có cách nào khác / tốt hơn để buộc các điều kiện truy vấn, đặc biệt is_front_page()
không?
Biên tập
Lưu ý rằng cài đặt page_id
không hoạt động trong cuộc pre_get_posts
gọi lại:
$query->set( 'page_id', get_option( 'page_on_front' ) );
Nếu tôi bỏ qua template_include
bộ lọc, thì trang hiển thị thực sự là trang được gán cho trang trước; tuy nhiên, get_page_template()
được sử dụng, chứ không phải là get_front_page_template()
. Vì vậy, thiết lập page_id
tại pre_get_posts
không gây ra is_page()
là đúng. Nhưng lỗi nói trên ngăn không cho is_front_page()
được đặt thành true
.
Chỉnh sửa 2
Yêu cầu của Per @ toscho, đây là một số mã var truy vấn, cho ngữ cảnh.
Đăng ký biến truy vấn:
/**
* Add options-related query variables
*/
function themslug_add_theme_demo_query_vars( $qvars ) {
$qvars[] = 'demo_foo';
$qvars[] = 'demo_bar';
$qvars[] = 'demo_baz';
return $qvars;
}
add_filter( 'query_vars', 'themeslug_add_theme_demo_query_vars' );
(Ở đâu foo
, bar
và baz
là các tùy chọn Chủ đề - nền, nhiều màu sắc, v.v.)
Cách chúng được sử dụng chỉ đơn giản là thêm bộ lọc vào tùy chọn Chủ đề - phần đó nằm ngoài phạm vi của câu hỏi, vì vậy tôi sẽ bỏ qua nó ở đây.
Chúng là đầu ra ở mặt trước thông qua Widget tùy chỉnh. Đầu ra Widget chỉ là một hình thức. Đây là một ví dụ về một trong các trường mẫu:
<h3>Foo</h3>
<input name="demo_foo" id="demo_foo" class="pickcolor" type="text" value="<?php echo $foo_setting; ?>" data-default-color="<?php echo $foo_setting; ?>" />
Đã tạo chuỗi truy vấn khi gửi:
www.example.com/?foo=some_value