Dapatkan URL saat ini (permalink) tanpa / page / {pagenum} /

11

Bagaimana saya bisa mengambil URL saat ini (apakah homepage, arsip, jenis arsip posting, kategori arsip, dll) tapi selalu tanpa satu /page/{pagenum}/bagian jika ada itu? Jadi, jika URL sebenarnya adalah:

example.com/category/uncategorized/

ATAU

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

maka nilai pengembalian akan selalu menjadi

example.com/category/uncategorized/

Ihor Vorotnov
sumber

Jawaban:

12

Anda bisa mendapatkan URL saat ini melalui home_url( $wp->request ).

Coba contoh di bawah ini:

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;
Govind Kumar
sumber
Ini berhasil! Meskipun itu tidak menghasilkan apa-apa jika tidak ada / page / X / di URL, jadi saya memodifikasi sedikit untuk membuatnya universal. Terima kasih banyak!
Ihor Vorotnov
7

Jawaban oleh Govind Kumar berfungsi, namun, itu hanya mengembalikan URL jika / halaman / {pagenum} / ada di URL dan tidak mengembalikan apa pun jika tidak. Saya membutuhkan solusi universal yang akan selalu mengembalikan URL dasar tanpa pagination, jadi saya memodifikasi sedikit kode Govind dan membungkusnya menjadi sebuah fungsi:

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();

Sekarang, selalu mengembalikan URL yang benar.

( Ini berguna jika Anda perlu menerapkan beberapa jenis filter posting yang menambahkan param ke filter posting oleh, katakanlah, meta diajukan. Jadi, bahkan jika pengguna menetapkan param filter di halaman X, hasil yang difilter baru akan selalu mulai dari URL dasar, bukan halaman X dan melemparkan 404 jika ada lebih sedikit posting yang difilter. )

Ihor Vorotnov
sumber
Baik sekali. Sangat dekat. Tetapi 'halaman' tidak cukup ketat. Misalnya, halaman-me.com akan mengembalikan nilai; nilai yang salah.
Ketua Alchemist
@ChiefAlchemist poin bagus, bahkan tidak memikirkan /pagesubstring yang menjadi bagian dari nama domain (jika www tidak digunakan, tentu saja). Itu, imo, lebih merupakan kasus tepi. Namun, saya mendorong Anda untuk berkontribusi dengan menambahkan kode yang akan mencakup kasus ini juga.
Ihor Vorotnov
Vorotbov - Akan lakukan. Silahkan lihat di bawah ini. fwiw, ada banyak kata dengan 'halaman' substr di dalamnya. Saya tidak berpikir aman untuk menganggap itu kasus tepi. Terbaik untuk membuatnya sekencang mungkin. Kurang khawatir dalam jangka panjang.
Ketua Alchemist
Benar, tetapi sementara saya setuju dengan Anda secara umum, pertanyaannya adalah masalah khusus, dan diselesaikan dengan cara yang paling efisien untuk kasus tertentu. Jika domain saya tidak memiliki substring ini, maka saya hanya tidak perlu menggunakan regex yang lebih lambat daripada substring sederhana (dan yang berfungsi dengan baik untuk kasus saya). Ini bukan plugin atau tema publik, jadi saya tidak perlu membahas setiap dan semua kasus tepi yang mungkin. Namun, penambahan Anda dihargai dan harapan dapat membantu beberapa devs di masa depan. Terima kasih!
Ihor Vorotnov
5

Sebenarnya cara termudah adalah dengan menggunakan get_pagenum_link()yang akan mengembalikan Anda URL saat ini tanpa /page/*paramaters.


Bonus

Anda juga dapat menggunakannya untuk membuat tautan "Sebelumnya" dan "Berikutnya" secara dinamis menggunakan 'paged'variabel kueri:

// 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>';
leymannx
sumber
3

Spesifik saya sangat mirip dengan Ihor Vorotnov, kecuali saya memiliki lebih dari satu parameter. Jadi, mulai dari jawabannya, saya memodifikasi kode untuk menggunakan ekspresi reguler:

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

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

    return  $nopaging_url;
}
Lorenzo
sumber
0

Jika Anda ingin menghapus semua kombinasi pagination yang mungkin, gunakan snippet ini:

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

Itu akan diurus

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

dan case-sensitive, berfungsi untuk nomor halaman pagination dan juga akan menghapus kombinasi nomor / nomor / nomor tambahan ... (tes di sini: https://regex101.com/r/9fQaLC/1 )

Jika Anda ingin mendapatkan url lengkap dengan memimpin http, tambahkan saja

$url = home_url($url);

Di baris itu Anda juga dapat menambahkan parameter GET kustom seperti itu

$url = home_url($url . '?typ=test');
Larzan
sumber
1
Secara pribadi, saya selalu berusaha untuk menghindari regex jika sesuatu dapat dilakukan tanpa mereka (dan masih cukup sederhana). Juga, add_query_arg () harus digunakan untuk menambahkan paret GET alih-alih penggabungan string. Tetapi jawabannya sendiri sudah benar dan berhasil, terima kasih.
Ihor Vorotnov
-1

Sementara pertanyaan ini sudah dijawab di sini (tidak diterima), potongan ini harus melakukan trik: home_url(add_query_arg(NULL, NULL));.

Fabian Marz
sumber
Saya sudah mencoba trik ini, tidak berhasil. Outputnya masih memiliki / page / 2 / append.
Ihor Vorotnov
Oh maaf, saya mengerti Anda ingin mendapatkan URL lengkap tetapi gagal karena selalu mengembalikan URL tanpa 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;
    }
}
Kepala Alchemist
sumber
Bolehkah saya bertanya mengapa Anda mengembalikan false jika $ str_url bukan string? Jika Anda secara tidak sengaja (yang seharusnya tidak terjadi btw) melewati hal lain, Anda menghancurkan data. Saya kira mengembalikan $ str_url yang belum dimodifikasi akan lebih baik. Juga, Anda memiliki tanda centang untuk string, tetapi tidak memastikan itu benar-benar URL yang dapat diuraikan (dan jika tidak, kode berikut ini akan rusak - wp_parse_url dapat mengembalikan false, null, int, string dan array). Selain itu, saya tidak yakin apakah menggunakannya sebagai suatu sifat masuk akal, tidak semua orang menggunakan kelas di mana-mana (hei, itu WordPress, kan?).
Ihor Vorotnov