繁体   English   中英

将联盟 URL 查询参数添加到 Wordpress 单个页面上域的所有链接

[英]Add affiliate URL query parameter to all links of a domain on a single page in Wordpress

我正在我的 wordpress 网站上准备一个页面,我将在其中发布我所属网站的优惠券和产品网址。

我不想在每个 URL 上手动创建附属链接,而是想在这个特定域的每个 URL 上自动添加附属查询参数。

网址可能是:

example.com
example.com/
example.com/cell-phones-c_11293/
example.com/cell-phones/pp_617010.html?wid=4

我要添加的查询参数是 ?lkid=12345678(每个 URL 都相同)。

example.com?lkid=12345678
example.com/?lkid=12345678
example.com/cell-phones-c_11293/?lkid=12345678
example.com/cell-phones/pp_617010.html?wid=4&lkid=10823628

我只想要这个特定页面的功能,而不是 Wordpress 上的每个帖子,所以我不想将代码添加到functions.php,或者只为这个页面安装插件。

是否可以通过编辑器中的“脚本”屏幕选项将其作为页眉或正文脚本添加到页面中?

我从这个答案中找到了以下代码,

<script>
var $links = $('a'); // get all anchor tags

// loop through each anchor tag
$.each($links, function(index, item){
    var url = $(this).attr('href'); // var for value of href attribute
            // use regex to match your domain
            var pattern = new RegExp(/(example.com\/)(.*)/i);
            if(pattern.test(url))
                $(this).attr('href', url + '?lkid=12345678');
                // append ?lkid=12345678 if url contains example
});
</script>

以及来自这个答案的以下代码

<script>
function updateQueryStringParameter(uri, key, value) {
  var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
  var separator = uri.indexOf('?') !== -1 ? "&" : "?";
  if (uri.match(re)) {
    return uri.replace(re, '$1' + key + "=" + value + '$2');
  }
  else {
    return uri + separator + key + "=" + value;
  }
}
</script>

...但不幸的是,我不知道足够的编程来使它们适用于我的情况。

如果没有查询字符串,此代码将添加参数,并将解析、添加参数并重新编码已具有查询字符串的链接:

<!DOCTYPE html>
<html>
    <head>
        <title>></title>
    </head>
    <body>
        <a href="http://www.example.com">Test</a>
        <a href="//www.google.com?test=1">Test</a>
        <a href="http://www.example.com/?test=1">Test</a>
        <a href="www.example.com?test=1">Test</a>
        <a href="../?test=1&another=2">Test</a>
        <a href="?test=1&another=2">Test</a>
        <script>
            // parseQuery: Originally from StackOverflow of: https://stackoverflow.com/a/13419367/2529423
            function parseQuery(qstr) {
                var query = {};
                var a = (qstr[0] === '?' ? qstr.substr(1) : qstr).split('&');
                for (var i = 0; i < a.length; i++) {
                    var b = a[i].split('=');
                    query[decodeURIComponent(b[0])] = decodeURIComponent(b[1] || '');
                }
                return query;
            }

            // encodeQuery originally from StackOverflow: https://stackoverflow.com/a/1714899/2529423
            function encodeQuery(obj) {
              var str = [];
              for(var p in obj)
                if (obj.hasOwnProperty(p)) {
                  str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
                }
              return str.join("&");
            }

            function addQueryParameterToDomain(key, value, conditionDomain) {
                var links = document.querySelectorAll('a[href]'),
                    linksLength = links.length,
                    index,
                    queryIndex,
                    queryString,
                    query,
                    url,
                    domain,
                    colonSlashSlash;

                // Iterate through and add query paramter
                for(index = 0; index < linksLength; ++index) {
                    url = links[index].href,
                    queryIndex = url.indexOf('?'),
                    colonSlashSlash = url.indexOf('://');

                    domain = url.substring(colonSlashSlash + 3);
                    domain = domain.substring(0, domain.indexOf('/'));

                    if(domain !== conditionDomain) {
                        continue;
                    }

                    if(queryIndex === -1) {
                        url += '?' + key + '=' + value;
                    } else {
                        queryString = url.substring(queryIndex);
                        url = url.substring(0, queryIndex);
                        query = parseQuery(queryString);

                        query[key] = value;

                        url += '?' + encodeQuery(query);
                    }

                    links[index].href = url;
                }
            }

            jQuery(function() {
                addQueryParameterToDomain('lkid', '12345678', 'example.com');
                addQueryParameterToDomain('lkid', '12345678', 'www.example.com');
            });
        </script>
    </body>
</html>

您需要做的就是将您拥有的脚本替换为上面<script>标记的内容,而 bob 是您的叔叔。

第一个答案看起来有效,除非 href 已经有一些参数 (?x=y)。 此外,建议将 jQuery 代码放在 .ready 函数中。 最后,在默认情况下,在 wordpress 中,您需要使用jQuery而不是$别名,或者将$传递给函数,我在这里做的是:

<script>
jQuery(document).ready(function( $ ){
    var $links = $('a'); // get all anchor tags

    // loop through each anchor tag
    $.each($links, function(index, item){
        var url = $(this).attr('href'); // var for value of href attribute
            // use regex to match your domain
            var pattern = new RegExp(/(example.com\/)(.*)/i);
            if(pattern.test(url))
                var chr = url.indexOf("?") == -1 ? "?" : "&"; // will be "&" if "?" in url
                $(this).attr('href', url + chr + 'lkid=12345678');
                // append ?lkid=12345678 if url contains example
    });
});
</script>

试一试,如果它适合你,我会对参数做一些改进。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM