Intereting Posts
Дизайн URL-адресов для подписок? Скрипт Enqueue при неудаче входа в систему Не удалось сбросить пароль WordPress Как проверить, имеет ли конкретный дочерний термин общие должности с другим набором дочерних терминов в рамках одной таксономии? Сопоставление доменов с WPMU Как выбрать пользовательский тип «верхнего уровня» в редакторе? Добавить функцию плагина WordPress для передачи данных изображения на другую страницу Мой собственный флажок флажка checkbox сохраняет последнее значение, которое я проверил Нестандартные значения поля не отображаются на странице редактирования пользовательского типа сообщения Как фильтровать сообщение из категорий только в том случае, если сообщения появляются в одном из них, а не в другом? Разрешить пользователю «edit_others_posts» сохранять только, а не публиковать Как сделать тактику пользовательской таксономии, как «Категории», Проблема с отмеченным () эхом на странице Показать наиболее просматриваемые сообщения последних дней по ссылке? Логотип сайта не доступен

отслеживать все внешние ссылки в блоге через имя пользователя

Я искал плагин, который может отслеживать все внешние ссылки, нажатые в блоге. К сожалению, те, которые я нашел, предназначены для отслеживания общего количества кликов на ссылку, а не для отслеживания того, какой пользователь нажал на какую ссылку. Есть ли плагин, который позволит мне отслеживать ссылки на основе имени пользователя?

Если нет, я могу написать сценарий для перехвата каждого клика, сохранить имя пользователя в db, а затем перенаправить на правильную страницу. Но мне нужно каким-то образом определить имя пользователя до щелчка ссылки. Есть ли плагин, который позволит мне вставить параметр (имя пользователя) в любой URL-адрес в блоге?

Например: http://myblog.com/myscript.php?url=http%3A//www.google.com&user= {{username}}

Я посмотрел на WordPress API, и кажется, что достаточно легко получить информацию об учетной записи пользователя, но если я связываюсь с пользовательским скриптом (а не с wordpress-страницей), в котором для WordPress-файлов мне нужно включить, чтобы у меня был доступ к объекту WP_User?

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

Я не знаю о существующем плагине, который делает то, что вы хотите.

Использование пользовательского скрипта довольно сложно, я бы не попробовал это. В основном потому, что вы не знаете, какие функции WP вы можете использовать / какие функции требуют от других работать, …

Если вы хотите отслеживать ссылки, я бы использовал событие ajax, чтобы отправить сообщение «click» в WordPress, когда кто-то нажимает на ссылку. Также вам не нужно get_current_user_id() имя пользователя в URL-адресе, так как вы всегда можете использовать get_current_user_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; } 

Обновить

Если вы получаете 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' ); } 

FYI: вы можете найти немного больше информации о window.wp.ajax в этом сообщении https://wordpress.stackexchange.com/a/245275/31140

Я понимаю, что кто-то в основном сделал мой комментарий и добавил в качестве ответа. Вот полностью рабочая версия, использующая встроенный 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' ); ?>'); }, 

При нажатии на внешнюю ссылку, вызов ajax выполняется в пользовательский маршрут REST. Ссылка затем добавляется к массиву 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() ); 
 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 }