Advertisement
Guest User

YourlsGA

a guest
Jan 20th, 2014
486
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 18.41 KB | None | 0 0
  1. <?php
  2. /*
  3. Plugin Name: Google Analytics
  4. Plugin URI: http://www.seodenver.com/yourls-analytics/
  5. Description: Easily add Google Analytics tracking tags to your generated links.
  6. Version: 1.0.4
  7. Author: Katz Web Services, Inc.
  8. Author URI: http://www.katzwebservices.com
  9. Settings: <a href="?page=google_analytics">Configure settings</a>
  10. */
  11.  
  12. if(!function_exists('yourls_add_filter') || !defined('YOURLS_SITE')) { return; }
  13.  
  14. // Register our plugin admin page
  15. yourls_add_action( 'plugins_loaded', 'kws_yourls_add_analytics_add_page' );
  16. function kws_yourls_add_analytics_add_page() {
  17.     yourls_register_plugin_page( 'google_analytics', 'Google Analytics', 'kws_yourls_add_analytics_do_page' );
  18.     // parameters: page slug, page title, and function that will display the page itself
  19. }
  20.  
  21. function kws_yourls_analytics_defaults() {
  22.     // Define defaults
  23.     $utm_campaign = '';
  24.     $utm_medium = 'urlshortener';
  25.     $utm_term = $utm_content = '';
  26.     $utm_source = preg_replace('/(?:.*?)\:\/\/(.+)/ism', '$1', YOURLS_SITE); // http://exam.pl becomes exam.pl
  27.  
  28.     $query = array(
  29.         'utm_source' => $utm_source,
  30.         'utm_medium' => $utm_medium,
  31.         'utm_campaign' => $utm_campaign,
  32.         'utm_term' => $utm_term,
  33.         'utm_content' => $utm_content
  34.     );
  35.  
  36.     $defaults = yourls_get_option('analytics_defaults');
  37.  
  38.     if(!is_array($defaults)) { return $query; }
  39.  
  40.     $settings = array_merge($query, $defaults);
  41.  
  42.     // These two are required.
  43.     if(empty($settings['utm_source'])) {
  44.         $settings['utm_source'] = $utm_source;
  45.     }
  46.     if(empty($settings['utm_medium'])) {
  47.         $settings['utm_medium'] = $utm_medium;
  48.     }
  49.  
  50.     return $settings;
  51. }
  52.  
  53. // Display admin page
  54. function kws_yourls_add_analytics_do_page() {
  55.  
  56.     // Check if a form was submitted
  57.     if( isset( $_POST['analytics_override'] ) )
  58.             kws_yourls_add_analytics_update_option();
  59.  
  60.     // Get value from database
  61.     $analytics_override = yourls_get_option( 'analytics_override' );
  62.     $add_to_form = yourls_get_option( 'add_to_form' );
  63.     if($add_to_form === false) { $add_to_form = 'yes'; } // Defaults to yes
  64.  
  65.     $analytics_defaults = (array)kws_yourls_analytics_defaults();
  66.  
  67. ?>
  68.     <style type="text/css">
  69.          .description { color:#555; font-style:italic; }
  70.          #ga_settings { font-size: 120%; }
  71.          #ga_settings h4 {
  72.             margin-bottom: .25em;
  73.          }
  74.          .submit {
  75.             margin-top: .5em;
  76.             padding-top: .9em;
  77.             border-top: 1px solid #ccc;
  78.             padding-bottom: 1em;
  79.          }
  80.          .submit input {
  81.             font-size: 14px!important;
  82.          }
  83.          #more_tracking_code_info {
  84.             display: none;
  85.             padding:5px 15px 5px 15px;
  86.             background: #fcfcfc;
  87.             border-top: 2px solid #ccc;
  88.          }
  89.          label.borderbottom {
  90.             border-bottom: 1px dotted;
  91.             cursor: pointer;
  92.          }
  93.          .req { color: red; }
  94.     </style>
  95.     <h2>Google Analytics Settings</h2>
  96.  
  97.     <form method="post" id="ga_settings">
  98.         <h4>Tracking Tags</h4>
  99.         <p class="description">
  100.             The settings defined here will be the default Google Analytics tracking script settings. With the current configuration, the following string will be added to shortened URLs:<br/>
  101.             <code>?<?php
  102.                 $analytics_defaultsexample = $analytics_defaults;
  103.                 $urlstring = array();
  104.                 foreach($analytics_defaultsexample as $key => $value) {
  105.                     if(empty($value)) {
  106.                         unset($analytics_defaultsexample[$key]);
  107.                         continue;
  108.                     }
  109.                     $urlstring[] = $key.'='.$value;
  110.                 }
  111.                 echo implode('&', $urlstring);?>
  112.             </code><br/>
  113.         </p>
  114.         <p class="description"><strong>Note:</strong> These default settings can be overridden by shortening an URL with the tracking tags in place already. If you want to override (or not override), configure the "Override existing tracking tags?" setting below.</p>
  115.         <p style="clear:both;">
  116.             <label for="utm_source" style="padding-left:.75em;">Source<span class="req" title="Required">*</span> <input id="utm_source" type="text" size="15" name="analytics_defaults[utm_source]" value="<?php echo $analytics_defaults['utm_source']; ?>"></label>
  117.             <label for="utm_medium" style="padding-left:.75em;">Medium<span class="req" title="Required">*</span> <input id="utm_medium" type="text" size="15" name="analytics_defaults[utm_medium]" value="<?php echo $analytics_defaults['utm_medium']; ?>"></label>
  118.             <label for="utm_campaign" style="padding-left:.75em;">Campaign Name <input id="utm_campaign" type="text" size="15" name="analytics_defaults[utm_campaign]" value="<?php echo $analytics_defaults['utm_campaign']; ?>"></label>
  119.             <label for="utm_term" style="padding-left:.75em;">Term <input id="utm_term" type="text" size="15" name="analytics_defaults[utm_term]" value="<?php echo $analytics_defaults['utm_term']; ?>"></label>
  120.             <label for="utm_content" style="padding-left:.75em;">Content <input id="utm_content" type="text" size="15" name="analytics_defaults[utm_content]" value="<?php echo $analytics_defaults['utm_content']; ?>"></label>
  121.         </p>
  122.         <p class="description" style="text-align:center;"><span class="req">*</span> = required fields</p>
  123.         <?php kws_yourls_show_analytics_help(); ?>
  124.  
  125.         <h4>Override existing tracking tags?</h4>
  126.         <p class="description">If an URL already has Google Analytics tracking tags, do you want to use those instead of your default tracking tags?</p>
  127.         <p><label for="analytics_override_yes">Override with Defaults <input type="radio" id="analytics_override_yes" name="analytics_override" value="1"<?php if($analytics_override) { echo ' checked="checked"';}?> /></label>
  128.         <label for="analytics_override_no" style="padding-left:.5em; border-left:1px solid #ccc; margin-left:.5em;">Use Existing (default)<input id="analytics_override_no" type="radio" name="analytics_override" value="0"<?php if(!$analytics_override) { echo ' checked="checked"';}?> /></label></p>
  129.  
  130.  
  131.         <h4>Add GA tracking options to Add URL form?</h4>
  132.          <p><input type="hidden" name="add_to_form" value="no" /><label for="add_to_form_yes">Add tracking code options to Add URL form <input type="checkbox" id="add_to_form_yes" name="add_to_form" value="yes"<?php if($add_to_form != 'no') { echo ' checked="checked"';}?> /></label></p>
  133.  
  134.         <div class="submit">
  135.             <input style="display:block;" type="submit" value="Update Settings">
  136.         </div>
  137.  
  138.     </form>
  139. <?php
  140. }
  141.  
  142. function kws_yourls_show_analytics_help() {
  143. ?>
  144.     <p style="text-align:center;">Not sure what these settings are? <a class="toggle" href="#more_tracking_code_info">Show descriptions of these terms</a></p>
  145.         <div id="more_tracking_code_info" class="toggle">
  146.             <table class="outline2" border="0" cellpadding="0" cellspacing="5">
  147.                 <tbody>
  148.                     <tr>
  149.                         <td width="201">
  150.                             <p><label for="utm_source" class="borderbottom">Source (utm_source)</label></p>
  151.                         </td>
  152.  
  153.                         <td width="666"><span class="req">Required.</span> Use <strong>utm_source</strong> to identify a search engine, newsletter name, or other source.<br>
  154.                         <em>Example</em>: <tt>utm_source=google</tt></td>
  155.                     </tr>
  156.  
  157.                     <tr>
  158.                         <td>
  159.                             <p><label for="utm_medium" class="borderbottom">Medium (utm_medium)</label></p>
  160.                         </td>
  161.  
  162.                         <td><span class="req">Required.</span> Use <strong>utm_medium</strong> to identify a medium such as email or cost-per-click.<br>
  163.                         <em>Example</em>: <tt>utm_medium=cpc</tt></td>
  164.                     </tr>
  165.  
  166.                     <tr>
  167.                         <td>
  168.                             <p><label for="utm_campaign" class="borderbottom">Campaign Name (utm_campaign)</label></p>
  169.                         </td>
  170.  
  171.                         <td>Used for keyword analysis. Use <strong>utm_campaign</strong> to identify a specific product promotion or strategic campaign.<br>
  172.                         <em>Example</em>: <tt>utm_campaign=spring_sale</tt></td>
  173.                     </tr>
  174.  
  175.                     <tr>
  176.                         <td>
  177.                             <p><label for="utm_term" class="borderbottom">Term (utm_term)</label></p>
  178.                         </td>
  179.  
  180.                         <td>Used for paid search. Use <strong>utm_term</strong> to note the keywords for this ad.<br>
  181.                         <em>Example</em>: <tt>utm_term=running+shoes</tt></td>
  182.                     </tr>
  183.  
  184.                     <tr>
  185.                         <td>
  186.                             <p><label for="utm_content" class="borderbottom">Content (utm_content)</label></p>
  187.                         </td>
  188.  
  189.                         <td>Used for A/B testing and content-targeted ads. Use <strong>utm_content</strong> to differentiate ads or links that point to the same URL.<br>
  190.                         <em>Examples</em>: <tt>utm_content=logolink</tt> <em>or</em> <tt>utm_content=textlink</tt></td>
  191.                     </tr>
  192.                 </tbody>
  193.             </table>
  194.             <p style="text-align:center; font-weight:bold;"><a href="http://www.google.com/support/googleanalytics/bin/answer.py?answer=55578" target="_blank">Learn more about Google Analytics link tagging</a></p>
  195.         </div>
  196.     <?php
  197. }
  198.  
  199. // Update option in database
  200. function kws_yourls_add_analytics_update_option() {
  201.     if(isset($_POST['analytics_override'])) {
  202.         yourls_update_option( 'analytics_override', !empty($_POST['analytics_override']));
  203.     }
  204.     if(isset($_POST['add_to_form']) && $_POST['add_to_form'] == 'yes' || $_POST['add_to_form'] == 'no') {
  205.         yourls_update_option( 'add_to_form', $_POST['add_to_form']);
  206.     }
  207.     if(isset($_POST['analytics_defaults'])) {
  208.         $analytics_defaults = array();
  209.         if(is_array($_POST['analytics_defaults'])) {
  210.             foreach($_POST['analytics_defaults'] as $k => $v) {
  211.                 $analytics_defaults[$k] = yourls_sanitize_title($v);
  212.             }
  213.             yourls_update_option( 'analytics_defaults', $analytics_defaults);
  214.         }
  215.     }
  216. }
  217.  
  218. yourls_add_filter( 'custom_url', 'kws_yourls_custom_url', 999);
  219.  
  220. function kws_yourls_custom_url($url = '') {
  221.     if(!isset($_GET['allfields']) || !isset($_GET['keyword'])) { return $url; }
  222.  
  223.     $allfields = yourls_maybe_unserialize($_GET['allfields']);
  224.  
  225.     parse_str($allfields, $fields);
  226.  
  227.     $accepted = array('utm_source','utm_medium','utm_campaign','utm_term','utm_content');
  228.  
  229.     foreach($fields as $key => $field) {
  230.         if(!in_array($key, $accepted) || empty($field)) {
  231.             unset($fields[$key]);
  232.         }
  233.     }
  234.  
  235.     return yourls_add_query_arg($fields, $url);
  236. }
  237.  
  238. yourls_add_action( 'admin_init' , 'kws_yourls_error_messages' );
  239.  
  240. function kws_yourls_error_messages() {
  241.     if(!isset($_POST['analytics_defaults'])) { return; }
  242.     $settings = kws_yourls_analytics_defaults();
  243.     $message = '';
  244.     if(empty($_POST['analytics_defaults']['utm_source'])) {
  245.         $message .= '<p><label for="utm_source" class="borderbottom">Source</label> is a required field. It has been reset to the default setting: <tt>'.$settings['utm_source'].'</tt></p>';
  246.     }
  247.     if(empty($_POST['analytics_defaults']['utm_medium'])) {
  248.         $message .= '<p><label for="utm_medium" class="borderbottom">Medium</label> is a required field. It has been reset to the default setting: <tt>'.$settings['utm_medium'].'</tt></p>';
  249.     }
  250.     if(!empty($message)) {
  251.         echo yourls_add_notice($message);
  252.     }
  253. }
  254.  
  255.  
  256. // We need to hook into the admin init so we can modify the request before it gets
  257. // processed by the ajax calls et al.
  258. yourls_add_action( 'admin_init', 'kws_yourls_admin_init' );
  259.  
  260. function kws_yourls_admin_init() {
  261.     if((empty($_REQUEST['action']) || empty($_REQUEST['url'])) && !isset($_REQUEST['u'])) { return; }
  262.  
  263.  
  264.     // Bookmark
  265.     if(isset($_REQUEST['u'])) {
  266.  
  267.         $query = kws_yourls_analytics_defaults();
  268.  
  269.         if(isset($_GET)) {
  270.             unset($_GET['u'], $_GET['t'], $_GET['k'], $_GET['s'], $_GET['signature']);
  271.             $queryGET = kws_yourls_process_array($_GET);
  272.             foreach($queryGET as $key => $qg) { if(empty($qg)) { unset($queryGET[$key]); }}
  273.             $query = array_merge($query, $queryGET);
  274.             foreach($query as $k => $q) {
  275.                 if(empty($q)) { unset($query[$k]); }
  276.             }
  277.         }
  278.  
  279.         $_GET['u'] = $_REQUEST['u'] = yourls_add_query_arg($query, $_REQUEST['u']);
  280.  
  281.         return;
  282.     }
  283.  
  284.     // In the admin. We only want to process on adds and edits.
  285.     switch( $_REQUEST['action'] ) {
  286.         case 'add':
  287.         case 'edit_save':
  288.             $_REQUEST['url'] = yourls_apply_filter('custom_url', $_REQUEST['url']);
  289.             break;
  290.     }
  291.  
  292.     return;
  293. }
  294.  
  295.  
  296. yourls_add_action( 'html_head' , 'kws_yourls_addnew_js' );
  297.  
  298. function kws_yourls_addnew_js() {
  299.     $add_to_form = yourls_get_option('add_to_form');
  300.     if(!yourls_is_admin() || $add_to_form == 'no') { return; }
  301. ?>
  302. <script type="text/javascript">
  303.  
  304. // Overrride the existing function to include the new fields
  305. function add_link() {
  306.     if( $('#add-button').hasClass('disabled') ) {
  307.         return false;
  308.     }
  309.     var newurl = $("#add-url").val();
  310.     var nonce = $("#nonce-add").val();
  311.     if ( !newurl || newurl == 'http://' || newurl == 'https://' ) {
  312.         $("#add-url").css({'border-color':'red', 'color':'red'}).focus();
  313.         return;
  314.     }
  315.     $("#add-url").css({'border-color':'#88C0EB', 'color': '#595441'});
  316.     var keyword = $("#add-keyword").val();
  317.     var allfields = $('#new_url_form').serialize(); // Added by KWS
  318.     add_loading("#add-button");
  319.     $.getJSON(
  320.         ajaxurl,
  321.         {action:'add', url: newurl, keyword: keyword, nonce: nonce, allfields: allfields},
  322.         function(data){
  323.             if(data.status == 'success') {
  324.                 $('#main_table tbody').prepend( data.html ).trigger("update");
  325.                 $('#nourl_found').css('display', 'none');
  326.                 zebra_table();
  327.                 increment_counter();
  328.                 toggle_share_fill_boxes( data.url.url, data.shorturl, data.url.title );
  329.  
  330.                
  331.             }
  332.  
  333.             //reset_url();
  334.            
  335.  
  336.             add_link_reset();
  337.             end_loading("#add-button");
  338.             end_disable("#add-button");
  339.  
  340.             feedback(data.message, data.status);
  341.                     }
  342.     );
  343. }
  344.  
  345.     jQuery(document).ready(function($){
  346.         $('a.toggle').on('click', null, function(e) {
  347.             e.preventDefault();
  348.             var $div = $($(this).attr('href'));
  349.             var $that = $(this);
  350.             $div.slideToggle('normal', function() {
  351.                 if($div.is(':visible')) {
  352.                     $that.text($that.text().replace('Show', 'Hide'));
  353.                 } else {
  354.                     $that.text($that.text().replace('Hide', 'Show'));
  355.                 }
  356.             });
  357.             return false;
  358.         });
  359.         $('#new_url_form').append('<a style="display:block" class="toggle" href="#ga_tracking_options">Show GA Tracking Options</a><div class="toggle" id="ga_tracking_options"><?php
  360.  
  361.     $sources = kws_yourls_analytics_defaults();
  362.  
  363.     foreach($sources as $source => $value) {
  364.         $sourceNice = preg_replace('/(?:.*?)\_(.+)/ism', '$1', $source);
  365.         echo '<label for="'.$source.'" style="padding-left:.75em;">'.$sourceNice.' <input id="'.$source.'" type="text" size="12" name="'.$source.'" value="'.$value.'" /></label>';
  366.     }
  367.  
  368.  
  369.     ?></div><div style="clear:both;"></div>');
  370.  
  371.     });
  372.  
  373. </script>
  374. <?php
  375. }
  376.  
  377. yourls_add_filter( 'get_keyword_info', 'kws_yourls_add_analytics_tracking_code', 999, 4);
  378.  
  379. function kws_yourls_add_analytics_tracking_code($return, $keyword, $field, $notfound = false) {
  380.  
  381.     // If we're not working with a long URL, this filter is unnecessary.
  382.     if($field !== 'url' || yourls_is_admin() || defined('YOURLS_INFOS') || defined('YOURLS_PREVIEW')) { return $return; }
  383.  
  384.     // If we are working with a long URL, then let's get to it!
  385.     $url = $return;
  386.  
  387.     // Don't create a non-empty URL from an empty URL (i.e. one that was not in the database) since YOURLS depends on emptiness in yourls-go.php
  388.     if (empty($url)) {
  389.         return $return;
  390.     }
  391.  
  392.     $parsed = parse_url($url);
  393.         $parsed['scheme'] = isset($parsed['scheme']) ? $parsed['scheme'] : 'http';
  394.         $parsed['host'] = isset($parsed['host']) ? $parsed['host'] : '';
  395.         $parsed['path'] = isset($parsed['path']) ? $parsed['path'] : '';
  396.  
  397.     $urlStripped = $parsed['scheme'].'://'.$parsed['host'].$parsed['path'];
  398.     $urlQueryString = array();
  399.     $query = kws_yourls_analytics_defaults();
  400.  
  401.     $urlParsed = parse_url($url);
  402.  
  403.     // Are there query args in the long URL? We'll want an array of those, thanks.
  404.     if(isset($urlParsed['query'])) {
  405.         parse_str($urlParsed['query'], $urlQueryString);
  406.     }
  407.  
  408.     // Override trumps embedded long URL query args
  409.     if(yourls_get_option('analytics_override') == 1) {
  410.         echo '<h2>After override</h2>';
  411.         $query = array_merge(kws_yourls_process_array($urlQueryString), kws_yourls_process_array($query));
  412.     }
  413.     else {
  414.         $query = array_merge(kws_yourls_process_array($query), kws_yourls_process_array($urlQueryString));
  415.     }
  416.  
  417.     // $_GET query strings trumps all (If there are query args added to the shortlink)
  418.     if(isset($_GET)) {
  419.         $_GET = kws_yourls_process_array($_GET);
  420.         if(isset($_GET['u'])) {
  421.             unset($_GET['u'], $_GET['t'], $_GET['k'], $_GET['signature']);
  422.         }
  423.         foreach($_GET as $key => $value) {
  424.             if(!empty($value)) { $query[$key] = $value; }
  425.         }
  426.     }
  427.  
  428.     // Add back in the query string
  429.     $url = yourls_add_query_arg($query, $urlStripped);
  430.  
  431.     return $url;
  432. }
  433.  
  434. function kws_yourls_parse_url($url) {
  435.  
  436.     $urlParsed = parse_url($url);
  437.  
  438.     if(isset($urlParsed['query'])) {
  439.         parse_str($urlParsed['query'], $urlParsed);
  440.     }
  441.  
  442.     if(empty($urlParsed)) { return $url; }
  443.  
  444.     foreach($urlParsed as $key => $queryString) {
  445.         $queryStringParsed = explode('=', $queryString);
  446.         unset($urlParsed[$key]);
  447.         if(isset($queryStringParsed[0]) && isset($queryStringParsed[1])) {
  448.             $urlParsed[$queryStringParsed[0]] = $queryStringParsed[1];
  449.         } else {
  450.             continue;
  451.         }
  452.     }
  453.  
  454.     return $urlParsed;
  455. }
  456.  
  457. function kws_yourls_process_source_abbr($value = '') {
  458.     switch($value) {
  459.             case 'fb':
  460.                 $value = 'facebook';
  461.                 break;
  462.             case 'tw':
  463.                 $value = 'twitter';
  464.                 break;
  465.             case 'li':
  466.                 $value = 'linkedin';
  467.                 break;
  468.             case 'em':
  469.                 $value = 'email';
  470.                 break;
  471.         }
  472.     return $value;
  473. }
  474.  
  475. function kws_yourls_process_array($query) {
  476.  
  477.     if(!is_array($query)) { return $query; }
  478.  
  479.  
  480.     foreach($query as $key => $value) {
  481.         switch($key) {
  482.             case 'utm_medium':
  483.                 $utm_medium = kws_yourls_process_source_abbr($value);
  484.                 break;
  485.             case 'med':
  486.                 unset($query[$key]);
  487.                 $utm_medium = kws_yourls_process_source_abbr($value);
  488.                 break;
  489.             case 'medium':
  490.                 unset($query[$key]);
  491.                 $utm_medium = kws_yourls_process_source_abbr($value);
  492.                 break;
  493.             case 'utm_source':
  494.                 $utm_source = kws_yourls_process_source_abbr($value);
  495.                 break;
  496.             case 'source':
  497.                 unset($query[$key]);
  498.                 $utm_source = kws_yourls_process_source_abbr($value);
  499.                 break;
  500.             case 'src':
  501.                 unset($query[$key]);
  502.                 $utm_source = kws_yourls_process_source_abbr($value);
  503.                 break;
  504.             case 'utm_campaign':
  505.                 $utm_campaign = $value;
  506.                 break;
  507.             case 'campaign':
  508.                 unset($query[$key]);
  509.                 $utm_campaign = $value;
  510.                 break;
  511.             case 'cam':
  512.                 unset($query[$key]);
  513.                 $utm_campaign = $value;
  514.                 break;
  515.             case 'utm_content':
  516.                 $utm_content = $value;
  517.                 break;
  518.             case 'content':
  519.                 unset($query[$key]);
  520.                 $utm_content = $value;
  521.                 break;
  522.             case 'con':
  523.                 unset($query[$key]);
  524.                 $utm_content = $value;
  525.                 break;
  526.             case 'utm_term':
  527.                 $utm_term = $value;
  528.                 break;
  529.             case 'term':
  530.                 unset($query[$key]);
  531.                 $utm_term = $value;
  532.                 break;
  533.         }
  534.     }
  535.  
  536.     unset($query['utm_source'], $query['utm_medium'], $query['utm_campaign'], $query['utm_term'], $query['utm_content']);
  537.  
  538.     $query['utm_source'] = $utm_source;
  539.     $query['utm_medium'] = $utm_medium;
  540.     $query['utm_campaign'] = $utm_campaign;
  541.     $query['utm_term'] = $utm_term;
  542.     $query['utm_content'] = $utm_content;
  543.  
  544.     return $query;
  545.  
  546. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement