/ page / {pagenum} /なしで現在のURL(パーマリンク)を取得します


11

どのように私は、現在のURLを取得することができますが、常に(ホームページ、アーカイブ、ポスト型アーカイブ、カテゴリアーカイブ、などか)せずに/page/{pagenum}/、それの存在する場合の部分?したがって、実際のURLが次の場合:

example.com/category/uncategorized/

または

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

その場合、戻り値は常に

example.com/category/uncategorized/

回答:


12

現在のURLはから取得できますhome_url( $wp->request )

以下の例を試してください:

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;

これはうまくいった!URLに/ page / X /がない場合は何も返さなかったので、ユニバーサルにするために少し変更しました。どうもありがとう!
Ihor Vorotnov 2016年

7

Govind Kumarによる回答は機能しましたが、URLに/ page / {pagenum} /が存在する場合にのみURLを返し、存在しない場合は何も返しませんでした。常にページ付けなしでベースURLを返すユニバーサルソリューションが必要だったので、Govindのコードを少し変更して関数にラップしました。

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

現在は常に正しいURLを返します。

これは、メタファイルなどで投稿をフィルターするパラメーターを追加する何らかの種類の投稿フィルターを実装する必要がある場合に役立ちます。したがって、ユーザーがページXでフィルターパラメーターを設定した場合でも、新しいフィルター結果は常にベースURLではなく、ページXと少ないフィルタポストがあるかどう404を投げてから開始します。


とても良い。とても近い。しかし、「/ページ」は厳密ではありません。たとえば、page-me.comは値を返します。正しくない値。
チーフアルケミスト

@ChiefAlchemistの良い点は、/pageサブストリングがドメイン名の一部であるとさえ考えなかった(もちろん、wwwが使用されていない場合)。つまり、イモ、むしろエッジケースです。ただし、このケースもカバーするコードを追加して貢献することをお勧めします。
Ihor Vorotnov

Vorotbov-やります。下記を参照してください。fwiw、substr 'page'が含まれている単語がたくさんあります。エッジケースであると推定するのは安全ではないと思います。できるだけきつくするのが最善です。長い目で見れば心配が少ない。
チーフアルケミスト

確かに、私は一般的にあなたに同意しますが、質問は特定の問題であり、特定のケースに対して最も効率的な方法で解決されました。ドメインにこの部分文字列がない場合は、単純なsubstrよりも遅い(そして私の場合は問題なく動作する)正規表現を使用する必要はありません。これはパブリックプラグインやテーマではないため、考えられるエッジケースをすべてカバーする必要はありません。しかし、あなたの追加は高く評価されており、将来の開発者に役立つことを期待しています。ありがとう!
Ihor Vorotnov

5

実際には、最も簡単なのはget_pagenum_link()/page/*パラメータなしで現在のURLを返すことです。


ボーナス

また、'paged'クエリ変数を使用して動的に「前へ」および「次へ」リンクを構築するためにそれを使用することもできます。

// 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

私の詳細は、Ihor Vorotnovのものと非常によく似ていました。そこで、彼の答えから始めて、正規表現を使用するようにコードを変更しました。

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

可能なすべてのページネーションの組み合わせ削除したい場合は、次のスニペットを使用します。

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

お世話になります

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

大文字と小文字を区別せず、どのページ番号のページ番号でも機能し、末尾の番号/番号/番号の任意の組み合わせも削除します...(ここでのテスト:https : //regex101.com/r/9fQaLC/1

先頭のhttpで完全なURLを取得したい場合は、

$url = home_url($url);

その行では、カスタムGETパラメータを追加することもできます。

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

1
個人的には、正規表現なしで何かを実行できる場合は正規表現を避けようとしています(それでも十分に単純なままです)。また、GET paramsを追加するには、文字列連結ではなくadd_query_arg()を使用する必要があります。しかし、答え自体は正しいですし、感謝します。
Ihor Vorotnov

-1

この質問はすでにここで回答されていますが(受け入れられません)、次のスニペットでうまくいくはずです:home_url(add_query_arg(NULL, NULL));


私はこのトリックを試しましたが、機能しません。出力にはまだ/ page / 2 /が追加されています。
Ihor Vorotnov 2016年

申し訳ありませんが、完全なURLを取得したいのですが、常にURLを返さなかったため失敗しましたpage/{pagenum}
Fabian Marz、2016年

-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;
    }
}

$ str_urlが文字列でない場合、なぜfalseを返すのですか?偶然に(これは起こり得ないことですが)何かを渡した場合、データを破壊しています。代わりに、変更されていない$ str_urlを返す方が良いでしょう。また、文字列のチェックがありますが、それが実際に解析可能なURLであることを確認していません(そうでない場合、次のコードは壊れます-wp_parse_urlはfalse、null、int、string、および配列を返す可能性があります)。さらに、それを特性として使用することが理にかなっているかどうかはわかりません。誰もがどこでもクラスを使用しているわけではありません(WordPressですね)。
Ihor Vorotnov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.