web-dev-qa-db-ja.com

すべてのリンクにURLパラメータを追加する

すべてのページにフォームがあり、refという名前の隠しフィールドがあります。

ユーザーが www.example.com/1/ref=fb_ad に着陸し、このページのフォームに入力すると、フォームはURLパラメータを受け取ります。

ただし、ユーザーが www.example.com/2 のままになっていると、URLパラメーターは使用できなくなるため、ランディングページ以外の別のページにフォームを入力しても、ref hiddenフィールドは残ります。空の。

私はそのURLパラメータを保存するオプションを探しているので、ユーザーが別のページに移動しても隠しフィールドがキャッチされます。

2
Yaniv Lev Ari

1. Cookieを介してアフィリエイトを追跡する

アフィリエイトソースを追跡するには、内部追跡にCookieを使用できます。その場合は、外部リンクを変更するだけで済みます。

add_action( 'plugins_loaded', 'so265278_affiliate_check' );

function so265278_affiliate_check() {
    $is_affiliate = ! empty( $_GET['ref'] );
    if ( $is_affiliate ) {
        setcookie( 'affiliate', $_GET['ref'], MONTH_IN_SECONDS );
    }
}

これであなたはいつでもあなたのテーマ/プラグインの中のアフィリエイトソースをチェックすることができます:

function get_affiliate_source() {
    if ( ! empty( $_GET['ref'] ) ) { return $_GET['ref']; }
    if ( ! empty( $_COOKIE['affiliate'] ) ) { return $_COOKIE['affiliate']; }
    return false;
}

// ...
echo 'Affiliate source: ' . get_affiliate_source();

2.ページ上のリンクを置き換える

(外部の)リンクを変更するのは少し面倒です。すべてのリンクを修正する必要がある場合は、shutdownフックを使用して正規表現を使用してすべてのリンクを置き換えることができます。

ob_start(); // I think WP does ob-buffering by itself. You can try to remove this line...

add_action( 'shutdown', 'so265278_shutdown' );

function so265278_shutdown() {
    $html = '';

    while (ob_get_level() > 1) {
        $html .= ob_get_clean();
    }

    // replace the links here...

    echo $html;
}

もちろん、あなたはあなたのページのすべての正しいリンクを置き換えるために良い正規表現を持つ必要があります。

$regex = '#(<a.*?href=["\'])(.*?)(\2.*?>)#i';
$html = preg_replace_callback( $regex, '_modify_link', $html );

function _modify_link( $match ) {
    $url = add_query_arg( 
        array( 'ref' => get_affiliate_source() ), 
        $match[2] 
    );

    // Return the full `<a href...>` tag:
    return $match[1] . $url . $match[3];
}

より良い解決策 (異なるアプローチ)

上記のshutdownハンドラは、すべてのリクエストを解析するため、wp-adminページでも最も効率的な解決策ではありません。あなたが正しいマークアップで外部リンクを作成するための特定の機能を持っているなら、それはより良いでしょう。

これをリンケ。

function show_external_link( $url, $label ) {
    $affiliate = get_affiliate_source();

    if ( $affiliate ) {
        $url = add_query_arg( 
            array( 'ref' => get_affiliate_source() ), 
            $match[2] 
        );
    }

    printf(
        '<a href="%1$s" target="_blank" rel="nofollow" class="external">%2$s</a>',
        esc_url( $url ),
        $label
    );
}

// In your theme/plugins
<?php show_external_link( 'http://www.facebook.com/', 'Facebook' ); ?>
1
Philipp