Thêm điểm cuối viết lại phá vỡ trang trước tĩnh


7

Tôi có trang trước tĩnh cho cài đặt WP của tôi được đặt từ settings > reading. Sau đó, tôi đã thêm một điểm cuối URL bằng cách sử dụng.

add_rewrite_endpoint('foo', EP_ALL);

Vì vậy, trang trước nên được truy cập thông qua

http://example.com/
http://example.com/foo
http://example.com/foo/bar

Đối với # 1 Mọi thứ đều hoạt động tốt nhưng đối với mặc định # 2 và # 3 home.phpđược hiển thị thay vì trang chủ tĩnh. Đã thử nghiệm cục bộ trong cả cài đặt đơn và đa trang.

Đó là một hành vi mong muốn hoặc tôi đánh một cái gì đó bất thường? Quan trọng hơn là làm cách nào tôi có thể tạo WP để hiển thị trang chủ tĩnh trong điều kiện đã cho?

Giải pháp

Tôi đã nối vào parse_requestđể xử lý một phần mã nếu footồn tại. vì vậy, theo giải pháp của @ gmazzap. Tôi chỉ cần bỏ đặt nó sau đó. Không cần thêm chức năng hooked để vượt qua lỗi.

add_action('parse_request', function(&wp){

    $key = 'foo';

    if (!array_key_exists( $key, $wp->query_vars ) ) {
        return;
    }

    // do things when foo exists

    // we no longer need 'foo'
    unset($wp->query_vars[$key]);

});


1
ồ được. Đó là một lỗi rồi. Vé mở trong 22 tháng! Tôi chỉ vui mừng vì nó được sửa chữa!
Sisir

Câu trả lời:


4

Có thể tôi đã không hiểu điều này rất tốt, nhưng nếu bạn chỉ cần xóa 'foo'khỏi các vars truy vấn sẽ không đơn giản hơn nhiều để sử dụng 'request'bộ lọc và xóa var từ đó?

Mã cần thiết:

add_filter('request', function($query_vars) {
     return array_diff_key($query_vars, array('foo'=>''));
});

Nó:

  • chỉ chạy trên truy vấn chính
  • xóa var cho $wpđối tượng
  • hành động trước khi truy vấn được đặt $wp_query, vì vậy không cần phải xóa truy vấn khỏi đó
  • không ảnh hưởng đến tất cả các biến khác

Biên tập:

Một vấn đề của mã này là nó chạy rất sớm, do đó sẽ khó có thể bắt được sự hiện diện của biến truy vấn và làm một cái gì đó dựa trên sự hiện diện / giá trị của nó.

Một giải pháp có thể là chạy các điều kiện trên cùng một 'request'bộ lọc, ngay trước khi xóa var truy vấn (ví dụ: sử dụng cùng một hook với mức độ ưu tiên higer).

Một giải pháp khác có thể là thêm một cờ vào $wpđối tượng:

add_filter('request', function($query_vars) {
     $GLOBALS['wp']->_foo = isset($query_vars['foo']) ? $query_vars['foo'] : false;
     return array_diff_key($query_vars, array('foo'=>''));
});

Sau đó, có thể kiểm tra biến 'foo' trong bất kỳ hook nào được kích hoạt sau đó 'request', sớm nhất là'parse_request'

add_action('parse_request', function($wp) {
    $foo = $wp->_foo;
    // do something with foo
});

Cuối cùng là 'shutdown':

add_action('shutdown', function() {
    $foo = $GLOBALS['wp']->_foo;
    // do something with foo
});

Sẽ loại bỏ này footừ $wp->query_varstrên parse_requesthành động? Tôi đang chạy mã có điều kiện parse_requestkhi footồn tại.
Sisir

@Sisir có, như bạn có thể thấy trong nguồn core.trac.wordpress.org/browser/tags/4.2.2/src/wp-includes/ 'request' móc hook được bắn dòng trước đó 'parse_request'. Bạn có thể di chuyển điều kiện của mình để requesthook hoặc có thể sử dụng 'parse_request'để loại bỏ biến, ngay sau khi bạn làm điều gì đó dựa trên 'foo'sự hiện diện. Tôi cũng chỉnh sửa chữ A để bao gồm cách tiếp cận thứ ba.
gmazzap

Tại chỗ trên! Như tôi đã nối vào parse_request. Xóa fookhỏi var truy vấn sau khi tôi hoàn thành nó có vẻ phù hợp hơn. Tôi chỉ cần unset($wp->query_vars['foo']);ngay trước khi tôi thoát khỏi chức năng hooked của tôi trong parse_request. Cảm ơn sự giúp đỡ của bạn về điều này.
Sisir

4

Đây là một lỗi 25143 như @toscho đã chỉ ra và sẽ được sửa trong 4.3

Cách giải quyết Tìm thấy trong vé và sửa đổi một chút

WordPress thêm vào foonhư var truy vấn gây ra vấn đề. Vì vậy, chúng ta cần xóa nó trước khi WP truy vấn DB

add_action( 'pre_get_posts', 'wpse191771_unset_query_arg' );
function wpse191771_unset_query_arg($query){

    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    $key = 'foo';

    $query_vars =& $query->query_vars;

    if ( array_key_exists($key, $query_vars) ) {
        // unset ref var from $wp_query
        $query->set( $key, null );

        global $wp;
        // unset ref var from $wp
        unset( $wp->query_vars[ $key ] );

        // if in home (because $wp->query_vars is empty) and 'show_on_front' is page
        if ( empty( $wp->query_vars ) && get_option( 'show_on_front' ) === 'page' ) {
            // reset and re-parse query vars
            $wp->query_vars['page_id'] = get_option( 'page_on_front' );
            $query->parse_query( $wp->query_vars );
        }
    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.