web-dev-qa-db-ja.com

すべての内部リンクにクエリパラメータを追加する方法

WordPressブログ内のすべての内部リンクにURLクエリパラメータを追加しようとしています。たとえば、クライアントはこのリンクでブログにアクセスします。

www.example.com/?p1=test&p2=test

ブログ内のリンク、たとえば投稿へのリンクにクエリ文字列を追加したい場合は、次のようにします。

www.example.com/post1/?p1=test&p2=test

それをする方法はありますか?

2
Fadi

以下はnota complete ソリューションです(つまり@cjbjが述べたように、投稿コンテンツのリンクを処理しません)が、あなたが望むものすべてを達成するでしょう。 get_permalink()wp_page_menu() 、およびkinの出力を含む)を介してURLが取得される(WP Core、テーマ、またはプラグイン内の)リンク。

$filters = array (
    'post_link',       // when post_type == 'post'
    'page_link',       // when post_type == 'page'
    'attachment_link', // when post_type == 'attachment'
    'post_type_link',  // when post_type is not one of the above
    ) ;
foreach ($filters as $filter) {
    add_filter ($filter, 'wpse_add_current_requests_query_args', 10, 3) ;
    }

function
wpse_add_current_requests_query_args ($permalink, $post, $leavename)
{
    if (!is_admin ()) {
        // we only want to modify the permalink URL on the front-end
        return ;
        }

    // for the purposes of this answer, we ignore the $post & $leavename
    // params, but they are there in case you want to do conditional
    // processing based on their value
    return (esc_url (add_query_arg ($_GET, $permalink))) ;
}

説明

結果を返す前に、get_permalink()はそれが生成したパーマリンクに4つのフィルタ(上の$filters配列で名前が付けられている)のうちの1つを適用します。それで、私達はそれらのフィルターのそれぞれに引っ掛かります。

これらのフィルタにフックする関数は、 add_query_arg() を呼び出して、現在の要求に存在するクエリ引数を追加します(つまり、$_GET)。

重要なセキュリティ上の考慮事項

add_query_arg() で述べたように:

重要:add_query_arg()の戻り値はデフォルトではエスケープされません。クロスサイトスクリプティング(XSS)攻撃に対する脆弱性を防ぐために、出力はesc_url()またはそれに類するもので遅延エスケープする必要があります。

wpse_add_current_requests_query_args()の中でesc_url()を呼び出すことは、私がすべての場合に「後エスケープ」と呼ぶものではありません。しかし、残念なことに、WPコア関数の数(例: Walker_Page :: start_el() 、これは最終的にwp_page_menu()によって呼び出されます)は、戻り値esc_url()get_permalink()を呼び出さないでください。安全のために私達のフィルターフックでそれを呼ばなければなりません。

クエリ文字列にアクセスするには、グローバル変数 $_SERVER$_SERVER['QUERY_STRING']を使用します。次のステップはあなたのブログの全ての内部リンクにこれを追加することです。リンクはどこにでも隠れているかもしれないので、これはもう少し難しいです。

投稿コンテンツに隠れているリンクは追跡して the_content filterで調整できます。 ここで は、内部リンクでのみそのフィルタを多少異なる使い方をした例です。

テーマとプラグインのパーマリンクは post_link filterを渡すべきです。これは文字列を追加するのにも使えます。

1
cjbj

それで、あなたは変数値を「保ちたい」のですか?たぶんあなたはクッキーを設定するのが一番ですか?これはおそらく物事をはるかに簡単かつクリーンにするでしょう。この記事を見て、それはあなたがクッキーを設定するために必要なすべてを持っているようです: https://premium.wpmudev.org/blog/set-get-delete-cookies/ そしてあなたは使うことができるはずですURLから変数を取得するためのget_query_var: https://codex.wordpress.org/Function_Reference/get_query_var

0
AppError