Nhận URL hiện tại (permalink) không có / page / {pagenum} /


10

Làm thế nào tôi có thể lấy URL hiện tại (cho dù là trang chủ, lưu trữ, bưu loại lưu trữ, loại lưu trữ, vv) nhưng luôn luôn mà không cần các /page/{pagenum}/phần nếu nó hiện nay? Vì vậy, nếu URL thực là:

example.com/category/uncategorized/

HOẶC LÀ

example.com/category/uncategorized/page/2/

sau đó giá trị trả về sẽ luôn là

example.com/category/uncategorized/

Câu trả lời:


12

Bạn có thể nhận được URL hiện tại thông qua home_url( $wp->request ).

Hãy thử ví dụ dưới đây:

global $wp;

// get current url with query string.
$current_url =  home_url( $wp->request ); 

// get the position where '/page.. ' text start.
$pos = strpos($current_url , '/page');

// remove string from the specific postion
$finalurl = substr($current_url,0,$pos);


echo $finalurl;

Điều này đã làm việc! Mặc dù nó không trả về gì nếu không có / page / X / trong URL, vì vậy tôi đã sửa đổi một chút để làm cho nó trở nên phổ biến. Cảm ơn rất nhiều!
Ihor Vorotnov

7

Trả lời bởi Govind Kumar đã làm việc, tuy nhiên, nó chỉ trả về URL nếu / page / {pagenum} / đã có trong URL và không trả lại gì nếu không. Tôi cần một giải pháp phổ quát sẽ luôn trả về URL cơ sở mà không cần phân trang, vì vậy tôi đã sửa đổi mã của Govind một chút và gói vào một hàm:

function get_nopaging_url() {

    global $wp;

    $current_url =  home_url( $wp->request );
    $position = strpos( $current_url , '/page' );
    $nopaging_url = ( $position ) ? substr( $current_url, 0, $position ) : $current_url;

    return trailingslashit( $nopaging_url );

}

echo get_nopaging_url();

Bây giờ, nó luôn trả về URL chính xác.

( Điều này hữu ích nếu bạn cần triển khai một số loại bộ lọc bài đăng có thêm thông số để lọc bài đăng bằng cách giả sử, một meta đã được gửi. bắt đầu từ URL cơ sở, không phải trang X và ném 404 nếu có ít bài đăng được lọc hơn. )


Rất tốt. Rất gần. Nhưng '/ trang' không đủ nghiêm ngặt. Ví dụ: page-me.com sẽ trả về một giá trị; một giá trị không chính xác.
Nhà giả kim trưởng

@ChiefAlchemist điểm tốt, thậm chí không nghĩ về /pagechuỗi con là một phần của tên miền (tất nhiên, nếu www không được sử dụng). Đó là, imo, đúng hơn là một trường hợp cạnh. Tuy nhiên, tôi khuyến khích bạn đóng góp bằng cách thêm mã sẽ bao gồm cả trường hợp này.
Ihor Vorotnov

Vorotbov - Sẽ làm. Vui lòng xem bên dưới. fwiw, có rất nhiều từ với 'trang' trong đó. Tôi không nghĩ rằng nó an toàn để cho rằng đó là một trường hợp cạnh. Tốt nhất để làm cho nó càng chặt chẽ càng tốt. Ít lo lắng trong thời gian dài.
Nhà giả kim trưởng

Đúng, nhưng trong khi tôi đồng ý với bạn nói chung, câu hỏi là một vấn đề cụ thể và nó đã được giải quyết theo cách hiệu quả nhất cho trường hợp cụ thể. Nếu tên miền của tôi không có chuỗi con này, thì tôi không cần sử dụng bất kỳ biểu thức chính nào chậm hơn chất nền đơn giản (và hoạt động tốt cho trường hợp của tôi). Đây không phải là một plugin hoặc chủ đề công khai, do đó tôi không cần phải bao gồm bất kỳ và tất cả các trường hợp cạnh có thể. Tuy nhiên, sự bổ sung của bạn được đánh giá cao và hy vọng có thể giúp một số nhà phát triển trong tương lai. Cảm ơn!
Ihor Vorotnov

5

Trên thực tế, cách dễ nhất là sử dụng get_pagenum_link()sẽ trả về cho bạn URL hiện tại mà không cần bất kỳ thông /page/*số nào .


Tặng kem

Bạn cũng có thể chỉ cần sử dụng nó để xây dựng các liên kết "Trước" và "Tiếp theo" một cách linh hoạt bằng cách sử dụng 'paged'biến truy vấn:

// Get the current page number.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$first_page = '<a href="' . get_pagenum_link() . '" class="page-first"><<</a>';
$prev_page = '<a href="' . get_pagenum_link($paged - 1) . '" class="page-prev"><</a>';
$next_page = '<a href="' . get_pagenum_link($paged + 1) . ' class="page-next">></a>';

// And having a `WP_Query` object you can also build the link for the last page:
$max = $the_query->max_num_pages;
$last_page = '<a href="' . get_pagenum_link($max) . '" class="page-last">>></a>';

3

Các chi tiết cụ thể của tôi rất giống với Ihor Vorotnov, ngoại trừ việc tôi có nhiều hơn một tham số. Vì vậy, bắt đầu từ câu trả lời của anh ấy, tôi đã sửa đổi mã để sử dụng biểu thức chính quy:

function get_nopaging_url() {
    $current_url =  $_SERVER[REQUEST_URI];

    $pattern = '/page\\/[0-9]+\\//i';
    $nopaging_url = preg_replace($pattern, '', $current_url);

    return  $nopaging_url;
}

0

Nếu bạn muốn xóa tất cả các kết hợp phân trang có thể thì hãy sử dụng đoạn mã này:

// remove pagination from url
$pattern = '/page(\/)*([0-9\/])*/i';
$url = preg_replace($pattern, '', $GLOBALS['wp']->request);

Nó sẽ chăm sóc

/page
/page/
/page/1
/page/1/
...

và không phân biệt chữ hoa chữ thường, hoạt động với mọi số trang phân trang và cũng sẽ xóa mọi kết hợp của số / số / số theo dõi ... (kiểm tra tại đây: https://regex101.com/r/9fQaLC/1 )

Nếu bạn muốn nhận url đầy đủ với http (s) hàng đầu, chỉ cần thêm

$url = home_url($url);

Trong dòng đó, bạn cũng có thể thêm bất kỳ tham số GET tùy chỉnh nào như vậy

$url = home_url($url . '?typ=test');

1
Cá nhân, tôi luôn cố gắng tránh regexes nếu có thể làm gì đó mà không có chúng (và vẫn đủ đơn giản). Ngoài ra, add_query_arg () nên được sử dụng để thêm tham số GET thay vì nối chuỗi. Nhưng câu trả lời là chính xác và thực hiện công việc, cảm ơn.
Ihor Vorotnov

-1

Mặc dù câu hỏi này đã được trả lời ở đây (không được chấp nhận), đoạn trích này nên thực hiện mẹo : home_url(add_query_arg(NULL, NULL));.


Tôi đã thử mẹo này, không hiệu quả. Đầu ra vẫn có / page / 2 / được nối thêm.
Ihor Vorotnov

Ôi xin lỗi, tôi hiểu bạn muốn lấy URL đầy đủ nhưng không thành công vì nó luôn trả lại URL mà không có page/{pagenum}.
Fabian Marz

-1
trait TraitURLStrip {

    /**
     * Strips off paging and query string. Returns a filter-the-results friendly URL
     *
     * @param bool   $str_url
     * @param string $str_page
     *
     * @return bool|string
     */
    protected function urlStrip( $str_url = false , $str_page = 'page' ){

        if ( is_string( $str_url) ) {

            $arr_parse_url = wp_parse_url( $str_url );

            $str_path_no_page = '';
            if ( isset( $arr_parse_url['path'] ) ) {

                // if we're paging then remove that. please!
                $str_path_no_page = preg_replace( "/\/{$str_page}\/[0-9]*\/$/", "/", $arr_parse_url['path'] );

            }

            $str_scheme_host = "{$arr_parse_url['scheme']}://{$arr_parse_url['host']}";

            return $str_scheme_host . $str_path_no_page;
        }
        return false;
    }
}

Tôi có thể hỏi tại sao bạn trả về false nếu $ str_url không phải là một chuỗi? Nếu bạn vô tình (điều không nên xảy ra btw) vượt qua bất cứ điều gì khác, bạn đang phá hủy dữ liệu. Tôi cho rằng việc trả lại $ str_url không thay đổi sẽ tốt hơn. Ngoài ra, bạn có kiểm tra chuỗi, nhưng không chắc chắn đó thực sự là một URL có thể được phân tích cú pháp (và nếu không, đoạn mã sau sẽ bị hỏng - wp_parse_url có thể trả về false, null, int, chuỗi và mảng). Ngoài ra, tôi không chắc liệu sử dụng nó như một đặc điểm có ý nghĩa hay không, không phải ai cũng sử dụng các lớp ở mọi nơi (hey, đó là WordPress, phải không?).
Ihor Vorotnov
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.