通过用户名跟踪博客上的所有外部链接

时间:2016-11-06 作者:tium

我一直在搜索一个插件,它可以跟踪在博客上点击的所有外部链接。不幸的是,我发现的这些工具旨在跟踪每个链接的总点击量,而不是跟踪哪个用户点击了哪个链接。有没有插件可以让我根据用户名跟踪链接?

如果没有,我可以编写一个脚本来拦截每次单击,将用户名保存到db,然后重定向到正确的页面。但在点击链接之前,我需要一些方法来确定用户名。是否有一个插件可以让我在博客文章的任何url/链接中插入参数(用户名)?

例如:http://myblog.com/myscript.php?url=http%3A//www.google.com&user={{用户名}}

我看过wordpress API,似乎很容易检索用户帐户信息,但如果我链接到自定义脚本(而不是wordpress页面),我需要包括哪些wordpress文件,以便访问WP\\U用户对象?

<?php
// include “someWordPressFile.php”;
$user = wp_get_current_user();
?>

3 个回复
最合适的回答,由SO网友:Philipp 整理而成

我不知道有什么插件可以满足你的需要。

使用自定义脚本非常困难,我不会尝试这样做。主要是因为您不知道您可以使用哪些WP功能/哪些功能需要其他人来工作。。。

如果您想跟踪链接,那么我会使用ajax事件在有人单击链接时向WordPress发送“单击”事件。此外,您不需要在URL中包含用户名,因为您可以始终使用get_current_user_id() 以确定登录的用户ID。

解决方案可以是一个简单的脚本,具有以下结构:

// 1. Add a javascript for click-tracking on every WordPress page.
add_action( \'wp_footer\', \'add_tracking_script\' );
function add_tracking_script() {
    ?><script>jQuery(function(){
      function domain(url) {
        return url.replace(\'http://\',\'\').replace(\'https://\',\'\').split(\'/\')[0];
      }

      var local_domain = domain(\'<?php echo site_url() ?>\');

      jQuery(\'a\').on(\'click\', function(){
        var link_url = jQuery(this).attr(\'href\');

        if (domain(link_url) === local_domain) {return true;}
        window.wp.ajax.send(\'tracking-click\', {url: link_url})
        return true;
      })
    })</script><?php
}

// 2. Add the ajax handler for the tracking.
add_action( \'wp_ajax_tracking-click\', \'ajax_handler_tracking\' );
function ajax_handler_tracking() {
  $user_id = get_current_user_id();
  $url = $_REQUEST[\'url\'];

  // Save the user_id + $url to your DB table...

  exit;
}

Update

如果出现JS错误window.wp.ajax.send is undefined 然后您还需要添加此php代码来告诉WordPress您要使用window.wp

// 3. Make sure WordPress loads the window.wp object:
add_action( \'wp_enqueue_scripts\', \'add_wp_utils\' );
function add_wp_utils() {
    wp_enqueue_script( \'wp-utils\' );
}
仅供参考:您可以在window.wp.ajax 在此帖子中https://wordpress.stackexchange.com/a/245275/31140

SO网友:jgraup

我意识到基本上有人发表了我的评论,并补充了我的回答。这是一个使用内置REST API 多样性。在经过身份验证的请求上查找停靠点有点棘手,但这应该是一个偶然的机会。

// send authorization info
beforeSend: function(xhr) {

    // attach REST nonce for logged in user requests -- otherwise will end up no-priv
    xhr.setRequestHeader (\'X-WP-Nonce\', \'<?php echo wp_create_nonce( \'wp_rest\' ); ?>\');
},
单击外部链接时,会对自定义REST路由进行ajax调用。然后将链接添加到users元中的URL数组中,并递增计数数据。

在几次外部单击之后,您可以检查用户的元数据,并查看所有单击和计数。

<?php

add_action( \'rest_api_init\', function() {

    // namespace of url
    $namespace = \'v2\';

    // route
    $base = \'/link/count/\';

    // register request
    register_rest_route( $namespace, $base, array (

            // hide from discovery
            \'show_in_index\' => false,

            // only accept POST methods
            \'methods\'       => \'POST\',

            // handler
            \'callback\'      => \'add_link_count\',

            // validate args
            \'args\' => array(
                \'link\' => array(
                    \'validate_callback\' => function($param, $request, $key) {
                        return ! empty( $param );
                    }
                ),
            ),

            // check for logged in users
            \'permission_callback\' => function () {
               return is_user_logged_in();
            }
    ) );
} );

// only add late in the footer
add_action( \'wp_footer\', function() {

    // only add for logged in users
    if ( ! get_current_user_id() ) {
        return;
    }
    ?>
    <script>
        (function($) {

            // only search for links with data
            $ (\'a[href^="http"], a[href^="//"]\').each (function() {

                // excluded specific domains
                var excludes = [
                    \'example.com\'
                ];
                for (i = 0; i < excludes.length; i++) {
                    if (this.href.indexOf (excludes[i]) != -1) {
                        return true; // continue each() with next link
                    }
                }

                // filter by domain -- only track external links
                if (this.href.indexOf (location.hostname) == -1) {

                    // attach click event
                    $ (this).click (function(e) {

                        // do ajax call
                        $.ajax ({

                            // send request to REST URL
                            url: \'<?php echo esc_js( get_rest_url( null, \'/v2/link/count/\' ) ); ?>\',

                            // use the accepted method - POST
                            method: \'POST\',

                            // send authorization info
                            beforeSend: function(xhr) {

                                // attach REST nonce for logged in user requests -- otherwise will end up no-priv
                                xhr.setRequestHeader (\'X-WP-Nonce\', \'<?php echo wp_create_nonce( \'wp_rest\' ); ?>\');
                            },
                            data: {
                                // link to track click count
                                \'link\': this.href
                            }
                        }).done (function(response) {
                            // show response in the console
                            // console.log (response);
                        });

                        // block click -- for testing
                        // e.preventDefault();
                    });
                }
            })
        } (jQuery));

    </script>
    <?php
}, 30 );

// handle the REST url
function add_link_count( $request ) {

    // get the current user
    $user_id = get_current_user_id();

    // check for valid user id > 0
    if ( ! $user_id || $user_id < 1 ) {
        return new WP_REST_Response( \'Unauthorized\', 403 );
    }

    // get the link to log
    $link = $request->get_param( \'link\' );

    // validate the request
    if( empty($link)) return new WP_REST_Response( \'Bad Request\', 400 );

    // pull the previous click data
    $prev = get_user_meta($user_id, \'link_clicks\', true);

    // generate if it doesn\'t already exist
    if( ! $prev || ! is_array($prev)) $prev = array();

    // make sure the value is numeric
    if( ! is_numeric($prev[$link]) ){
        $prev[$link] = 0;
    }

    // increment based on the click
    $prev[$link]++;

    // update the users metadata
    update_user_meta( $user_id, \'link_clicks\', $prev, null );

    // return success response
    return new WP_REST_Response( \'OK\', 200 );
}
要读取以单击返回,请使用单击元数据查询用户:

function get_clicks_by_user() {
    $args  = array (
        \'meta_query\' => array (
            array (
                \'key\'     => \'link_clicks\',
                \'compare\' => \'EXISTS\',
            ),
        ),
    );
    $user_query = new WP_User_Query( $args );
    $users = $user_query->get_results();
    $clicks_by_user = array ();
    foreach ( $users as $user ) {
        $clicks_by_user[ $user->data->user_login ] = get_user_meta( $user->ID, \'link_clicks\', true );
    }

    return $clicks_by_user;
}
并显示结果:

echo "<pre>";
print_r(  get_clicks_by_user() );

SO网友:tium
function user_tracking_script() {
?><script>jQuery(function(){
  jQuery(\'a\').on(\'click\', function(){
    var a = jQuery(this)[0];
    if (a.hostname === window.location.hostname) {return true;}
    window.wp.ajax.send(\'tracking-click\', {url: a.hostname})
    return true;
  })
})</script><?php
}

相关推荐

Permalinks without post type

我使用norebo主题我在打开公文包时使用它链接的格式如下https://www.hshnorm.com/project/fruit-flavored-powder-juice/ 如何删除该单词project成为此格式的链接https://www.hshnorm.com/fruit-flavored-powder-juice/