Организация маркетинговой онлайн-кампании с помощью произвольных типов записей

Произвольные типы записей позволяют установить степень гибкости для WordPress, что делает эту open-source платформу более полезной на различных уровнях веб-разработки. Всякий раз, когда я сталкиваюсь с веб-ориентированными задачами, особенно с теми из них, которые затрагивают организацию данных, я сразу же проверяю, может ли WordPress справиться с этой работой, и обычно получаю утвердительный ответ.

Как интернет-маркетолог и аналитик, я должен быть в состоянии организовать маркетинговые онлайн-кампании таким образом, чтобы их можно было отследить в Google Analytics. С такой задачей отлично справляются произвольные типы записей, существующие в WordPress.

В этой статье мы покажем, как создать WordPress плагин, позволяющий организовать маркетинговые интернет-кампании при помощи отслеживающих URL-адресов, их сокращенных версий, а также управляемых QR-кодов, которые вы можете использовать при ведении маркетинговой деятельности оффлайн.

Мы покажем вам, как создать указанный плагин так, чтобы максимизировать функциональность и легкость его использования. Если у вас имеются другие методы, которые вы считаете полезными, обязательно расскажите о них в комментариях. Кроме того, давайте помнить о том, что мы должны уважать разработчиков WordPress, которые заложили основы для более простого и непринужденного кодирования.

Ниже приведены критерии для нашего плагина:

— Он должен обеспечивать удобную форму, которая будет предлагать пользователям возможности по заданию целевой страницы (которую можно будет анализировать), анкора и контента, термов (если это Pay-per-click реклама), а также любой дополнительной информации, связанной с этой ссылкой.
— Он должен предлагать три произвольных типа таксономий, чтобы пользователи могли задавать URL-переменные для источника, медиа-информации и названия кампании. Типы таксономий будут использоваться как в кампаниях, так и в записях.
— Работа с плагином должна быть вестись через область администратора посредством пользовательского интерфейса.
— Вывод должен включать в себя ссылку на Google Analytics, информацию о ссылке, представленную в удобочитаемом формате, сокращенную версию URL-адреса, а также QR-код для него.

Файловая структура

Плагин будет состоять из трех файлов. Чтобы установить необходимую структуру, нам понадобится создать папку для плагина под названием campaign-tracker. Внутри папки campaign-tracker мы создадим следующие файлы:

— campaign-tracker.php
— ga-functions.php
— campaign-template.php
Теперь, когда файлы созданы, мы можем приступить к добавлению кода.

Файл плагина

Основной файл плагина – это campaign-tracker.php. Содержимое этого файла будет начинаться с заголовка, чтобы WordPress мог распознать этот файл как плагин. Затем мы перейдем к настройке класса CampaignTracker10 и функций. Мы установим произвольный тип записей для кампаний и зарегистрируем таксономию, в которой мы нуждаемся. Также мы заложим основы для интерфейса администратора.

<?php
/*
Plugin Name: Campaign Tracking 1.0
Plugin URI: http://www.convergeconsulting.org
Description: Google Analytics Campaign Tracking system for WordPress 3.0 and above.
Author: Joshua Dodson
Version: 1.0
Author URI: http://www.convergeconsulting.org
*/

// Include the ga-functions.php helper functions
include_once('ga-functions.php');

if(!class_exists('CampaignTracker10'))
{

   class CampaignTracker10 {

      var $meta_fields = array("gaca10-gaurl","gaca10-gaterm","gaca10-gacontent","gaca10-gadescription");

      // This function will create the custom post type. Thanks to Konstantin Kovshenin's example for additional examples of how to construct custom post types (http://kovshenin.com/2010/03/custom-post-types-in-wordpress-3-0-2089/), which inspired much of this.
      function __construct(){
         // Register custom post types
         register_post_type('campaign', array(
         'label' => _x('Campaigns','campaigns label'), // We're labeling the custom posts as Campaigns and also accounting for <a href="http://codex.wordpress.org/I18n_for_WordPress_Developers#Disambiguation_by_context" title="Disambiguation by context">gettext</a> appropriately
         'singular_label' => _x('Campaign','campaign singular label'), // Each post will be called a Campaign
         'public' => true, // These will be public
         'show_ui' => true, // Show the UI in admin panel
         '_builtin' => false, // This is a custom post type, not a built in post type
         '_edit_link' => 'post.php?post=%d',
         'capability_type' => 'post',
         'hierarchical' => false,
         'rewrite' => array("slug" => "campaign"), // This is for the permalinks
         'query_var' => "campaign", // This goes to the WP_Query schema
         'supports' => array('title'/* We only need the default title field, but we could use others such as 'author', 'excerpt', 'editor' ,'custom-fields'*/)
         ));

         add_filter("manage_edit-campaign_columns", array(&$this, "edit_columns"));
         add_action("manage_posts_custom_column", array(&$this, "custom_columns"));

         // Register custom taxonomies gasource (for the Campaign Source), gamedium (for the Campaign Medium), and ganame (for Campaign Name)
         // Campaign Source
         register_taxonomy("gasource", array("campaign"), array("hierarchical" => true, "label" => _x( 'Campaign Sources', 'campaign sources taxonomy label' ), "singular_label" => "Campaign Source", "rewrite" => true));
         // Campaign Medium
         register_taxonomy("gamedium", array("campaign"), array("hierarchical" => true, "label" => _x( 'Campaign Mediums', 'campaign mediums taxonomy label' ), "singular_label" => "Campaign Medium", "rewrite" => true));
         // Campaign Name
         register_taxonomy("ganame", array("campaign"), array("hierarchical" => true, "label" => _x( 'Campaign Names', 'campaign names taxonomy label' ), "singular_label" => "Campaign Name", "rewrite" => true));

         add_action("admin_init", array(&$this, "admin_init"));
         add_action("template_redirect", array(&$this, 'template_redirect'));

         add_action("wp_insert_post", array(&$this, "wp_insert_post"), 10, 2);

      }

Давайте присвоим столбцам на экране администратора некоторые заголовки:


function edit_columns($columns)
{
   $columns = array(
   'cb' => '<input type="checkbox" />',
   'title' => _x('Campaign Title','campaign title label for edit columns'),
   'gaca10_ganame' => _x('Campaign Name','campaign name label for edit columns'),
   'gaca10_gasources' => _x('Campaign Source','campaign source label for edit columns'),
   'gaca10_gasmedium' => _x('Campaign Medium','campaign medium label for edit columns'),
   );
   return $columns;
}

Теперь давайте определим, какие столбцы мы хотели бы видеть для этого произвольного типа записей на экране администратора. У нас будут столбцы для источника кампании, медиа-информации и названия, дополняемые заголовком записи.


function custom_columns($column)
{
   global $post;
   switch ($column)
   {
      // The campaign source
      case "gaca10_gasources":
      $gasources = get_the_terms(0, "gasource");
      if ( $gasources && ! is_wp_error( $gasources ) ) :
      $gasources_html = array();
      foreach ($gasources as $gasource)
      array_push($gasources_html, '<a href="' . get_term_link($gasource->slug, "gasource") . '">' . $gasource->name . '</a>');

      echo implode($gasources_html, ", ");
      endif;
      break;

      // The campaign medium
      case "gaca10_gasmedium":
      $gamediums = get_the_terms(0, "gamedium");
      if ( $gamediums && ! is_wp_error( $gamediums ) ) :
      $gamediums_html = array();
      foreach ($gamediums as $gamedium)
      array_push($gamediums_html, '<a href="' . get_term_link($gamedium->slug, "gamedium") . '">' . $gamedium->name . '</a>');

      echo implode($gamediums_html, ", ");
      endif;
      break;

      // The campaign name
      case "gaca10_ganame":
      $ganames = get_the_terms(0, "ganame");
      if ( $ganames && ! is_wp_error( $ganames ) ) :
      $ganames_html = array();
      foreach ($ganames as $ganame)
      array_push($ganames_html, '<a href="' . get_term_link($ganame->slug, "ganame") . '">' . $ganame->name . '</a>');

      echo implode($ganames_html, ", ");
      endif;
      break;
   }
}

Как только наши столбцы будут настроены соответствующим образом, мы должны будем увидеть следующий результат (обратите внимание, что в данном примере уже добавлена одна кампания):

Следующая секция позволяет нам определить, какой шаблон мы будем использовать для вывода на экран произвольного типа записей. Мы выбрали для этих целей шаблон campaign-template.php.

function template_redirect()
{
   global $wp;

   // If the post type is set and is campaign…
   if (isset($wp->query_vars["post_type"])) {
      if ($wp->query_vars["post_type"] == "campaign")
      {
         // Then use the campaign-template.php file from this plugin directory
         include WP_PLUGIN_DIR.'/campaign-tracker/campaign-template.php';
         die();
      }
   }
}

Если запись добавлена или обновлена, цикл проходит через массив и обновляет или добавляет мета данные записи.

function wp_insert_post($post_id, $post = null)
{
   if ($post->post_type == "campaign")
   {
      foreach ($this->meta_fields as $key)
      {
         $value = $_POST[$key];
         if (empty($value))
         {
            delete_post_meta($post_id, $key);
            continue;
         }

         if (!is_array($value))
         {
            if (!update_post_meta($post_id, $key, $value))
            {
               add_post_meta($post_id, $key, $value);
            }
         }
         else
         {
            delete_post_meta($post_id, $key);

            foreach ($value as $entry){
               add_post_meta($post_id, $key, $entry);
            }
         }
      }
   }
}

С помощью следующей функции мы можем добавить произвольные мета-боксы для экрана администратора. В них мы будем проводить редактирование кампании:

function admin_init()
{
   // Add custom meta boxes for the edit campaign screen
   add_meta_box("gaca10-meta", "Campaign Information", array(&$this, "meta_options"), "campaign", "normal", "core");
}

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

function meta_options()
   {
      global $post;
      $custom = get_post_custom($post->ID);
      if($custom["gaca10-gaurl"][0]){
         $gaurl = $custom["gaca10-gaurl"][0];
      }
      else{ $gaurl = ''; }
      if($custom["gaca10-gaterm"][0]) {
         $gaterm = $custom["gaca10-gaterm"][0];
      }
      else { $gaterm = ''; }
      if ($custom["gaca10-gacontent"][0]) {
         $gacontent = $custom["gaca10-gacontent"][0];
      }
      else { $gacontent = ''; }
      if ($custom["gaca10-gadescription"][0]) {
         $gadescription = $custom["gaca10-gadescription"][0];
      }
      else { $gadescription = ''; }

      $url = trackable_url();
      if ($custom["campaign_tinyurl"][0]) {
         if($gaurl == '') { $shortenedurl = ''; }
         else{ $shortenedurl = create_tiny_url($url); }
      }

      ?>
      <label><?php _ex('Website URL:','website url label'); ?></label><input name="gaca10-gaurl" value="<?php echo $gaurl; ?>" /><br />
      <em><?php _ex('(e.g., http://www.google.com)','website url example'); ?></em><br /><br />

      <label><?php _ex('Campaign Term:','campaign term label'); ?></label><input name="gaca10-gaterm" value="<?php echo $gaterm; ?>" /><br />
      <em><?php _ex('(identify the paid keywords)','campaign term information'); ?></em><br /><br />
      <label><?php _ex('Campaign Content:','campaign content label'); ?></label><input name="gaca10-gacontent" value="<?php echo $gacontent; ?>" /><br />
      <em><?php _ex('(use to differentiate ads)','campaign content information'); ?></em><br /><br />

      <label><?php _ex('Campaign Description:','campaign description label'); ?></label><input name="gaca10-gadescription" value="<?php echo $gadescription; ?>" /><br />
      <em><?php _ex('(use to remind yourself about this specific link)','campaign description information'); ?></em><br /><br />

      <label><?php _ex('Shortened URL:','shortened URL label'); ?></label><input name="gaca10-gashortened-url" value="<?php echo $shortenedurl; ?>" readonly="readonly" /><br />

      <?php
   }
}

}

Ниже представлен скриншот, как будет представлен экран “Add/Edit Campaign”.

Если класс CampaignTracker10 существует, то мы подключаем плагин.

if(class_exists('CampaignTracker10')){

   // Initiate the plugin
   add_action("init", "CampaignTracker10Init");

   function CampaignTracker10Init() {
      global $gaca10;
      $gaca10 = new CampaignTracker10();

   }
}

Объединим эти функции в файле campaign-tracker.php.

Следующие примеры таксономий должны также быть представлены на экране “Add/Edit Campaign” после того, как все будет добавлено. Ниже показана таксономия “Campaign Names”.

Далее идет таксономия “Campaign Mediums”.

Потом идет таксономия “Campaign Sources”.

Подобно тому, как мы настроили традиционные рубрики записей, вы можете установить новые рубрики или выбрать предыдущие рубрики.

Примечание по использованию: как только вы начнете работать с системой, попробуйте выбрать только одну рубрику, состоящую из названия, медиа-информации и источника. Одна рубрика в типе таксономии оказывается наиболее полезной при ведении фактического анализа в Google Analytics. Общее правило: одно название, один источник и одна медиа-информация для одного URL-адреса.

Полезные функции для отображения данных

Каждая из функций, представленных в данной секции, является частью файла ga-functions.php. Эти функции были отделены от других, чтобы сохранить целостность вывода информации на экран.

Наш файл будет начинаться с функции formatted_utm_taxonomy_terms, которая будет выводить на экран дружественную к пользователям версию URL-адреса термов таксономии.

<?php
/* Some Helpful Display Functions */

function formatted_utm_taxonomy_terms($the_term) {
   global $post;
   $post_terms = get_the_terms( $post->ID, $the_term );
   if ( $post_terms && ! is_wp_error( $post_terms ) ) :
   $encoded_terms = array();
   foreach ($post_terms as $term ) {
      if(!$encoded_terms[] = $term->slug){
         $encoded_terms[] = urlencode($term->name);
      }
   }
   $return_terms = implode('+',$encoded_terms);
   return $return_terms;
   endif;
}

Функция trackable_url генерирует отслеживающий URL-адрес из полей администраторского экрана и таксономий. Также она добавляет соответствующие критерии отслеживания к URL, чтобы приложение Google Analytics могло использовать информацию, полученную из указанных переменных. Чтобы реализовать это, мы воспользуемся WordPress функцией add_query_arg.

function trackable_url() {
   global $post;
   $custom = get_post_custom($post->ID);

   // the url
   if ($custom["gaca10-gaurl"][0]) {
      $gaurl = $custom["gaca10-gaurl"][0];
   }
   else { $gaurl = ''; }

   // the term(s)
   if ($gaterm = $custom["gaca10-gaterm"][0]) {
      $gaterm = $custom["gaca10-gaterm"][0];
      $gaterm = urlencode($gaterm);
   }
   else { $gaterm = ''; }

   // the content(s)
   if ($custom["gaca10-gacontent"][0]) {
      $gacontent = $custom["gaca10-gacontent"][0];
      $gacontent = urlencode($gacontent);
   }
   else { $gacontent = ''; }
   $arr_params = array ( 'utm_campaign' => formatted_utm_taxonomy_terms('ganame'), 'utm_source' => formatted_utm_taxonomy_terms('gasource'), 'utm_medium' => formatted_utm_taxonomy_terms('gamedium'), 'utm_term' => $gaterm, 'utm_content' => $gacontent);
   return add_query_arg( $arr_params, $gaurl );

}

Следующие функции производят захват привязанного к кампании URL и укорачивают его с помощью TinyURL. Этот метод использует wp_remote_get для генерации короткого URL. Когда запись будет сохранена, указанная функция внесет короткий URL-адрес в мета данные этой записи. Функция trackable_url_tiny позволит нам восстановить сокращенный URL в шаблоне.


// Save the shortened trackable URL to the post meta
function save_shortened_meta($post_ID) {
   $url = trackable_url();
   $shortened_url = create_tiny_url($url);
   update_post_meta($post_ID, "campaign_tinyurl", $shortened_url);
   return $post_ID;
}

// Add an action to save it when the post is saved.
add_action('save_post', 'save_shortened_meta');

// Retrieve the shortened URL from post meta
function trackable_url_tiny($url = null, $post_ID) {
   global $post;
   $custom_fields = get_post_custom($post->ID);
   $campaign_tinyurl = $custom_fields['campaign_tinyurl'][0];
   return $campaign_tinyurl;

   return $post_ID;
}

// Create shortened trackable URL through the wp_remote_get function
function create_tiny_url($strURL) {
   $tinyurl = wp_remote_get( 'http://tinyurl.com/api-create.php?url='.$strURL );
   if( is_wp_error( $response ) ) {
      return 'Something went wrong!';
   } else {
      return $tinyurl['body'];

   }
}

Функция trackable_url_report обеспечивает удобочитаемый формат переменных, которые разбиты по секциям. Целевая страница, название кампании, источник, медиа-информация, термы и контент всегда разделяются друг с другом и выводятся на экран в индивидуальном порядке, если они существуют.

function trackable_url_report() {
   global $post;
   $custom = get_post_custom($post->ID);

   // get the url
   if ($custom["gaca10-gaurl"][0]) {
      $gaurl = $custom["gaca10-gaurl"][0];
   }
   else { $gaurl = ''; }
   // get the term(s)
   if ($gaterm = $custom["gaca10-gaterm"][0]) {
      $gaterm = $custom["gaca10-gaterm"][0];
   }
   else { $gaterm = ''; }

   // get the content(s)
   if ($custom["gaca10-gacontent"][0]) {
      $gacontent = $custom["gaca10-gacontent"][0];
   }
   else { $gacontent = ''; }

   // The Landing page
   $url_info ='';
   $url_info.= "<strong>". _x( 'Landing Page:','landing page label') . "</strong> ";
   $url_info.= $gaurl;
   $url_info.= "<br />";

   // The campaign name
   $url_info.= "<strong>". _x( 'Campaign:','campaign label') . "</strong> ";
   $url_info.= formatted_utm_taxonomy_terms('ganame');
   $url_info.= "<br />";

   // The Source
   $url_info.= "<strong>". _x( 'Source:','source label') . "</strong> ";
   $url_info.= formatted_utm_taxonomy_terms('gasource');
   $url_info.= "<br />";

   // The medium
   $url_info.= "<strong>". _x( 'Medium:','medium label') . "</strong> ";
   $url_info.= formatted_utm_taxonomy_terms('gamedium');
   $url_info.= "<br />";

   // The term
   $url_info.= "<strong>". _x( 'Term:','term label') . "</strong> ";
   $url_info.= $gaterm;
   $url_info.= "<br />";

   // The content
   $url_info.= "<strong>". _x( 'Content:','content label') . "</strong> ";
   $url_info.= $gacontent;
   $url_info.= "<br />";

   return $url_info;
}

Функция display_description выводит на экран описание URL. Мы оставили эту часть в самом конце, чтобы не нарушать логический порядок следования остальных элементов, определенных для URL. Это заключительная функция в файле ga-functions.php.

function display_description(){
   global $post;
   $custom = get_post_custom($post->ID);
   $description = $custom["gaca10-gadescription"][0];
   return $description;
}

?>

Поместим все эти функции в один файл, после чего перейдем к созданию шаблона.

Шаблон

Заключительный этап в представлении отслеживающих URL-адресов – это создание файла campaign-template.php. Насколько вы помните, в файле campaign-tracker.php у нас имеется вызов функции template_redirect(), которая выполняет переадресацию пользователей к этому шаблону при просмотре произвольного типа записей, относящихся к кампании.

Для отображения целей мы будем использовать файл single.php из заданной по умолчанию WordPress темы Twenty Eleven. Вы можете, естественно, использовать другую тему и другие стили.

Для начала, мы подключим файл ga-functions.php, чтобы мы могли использовать некоторые из наших функций вывода. Шаблон кампании также будет использовать Google Charts API для отображения QR-кодов.

Следующий код будет выводить на экран URL-адрес, связанный с кампанией, информацию об URL, короткую версию URL и QR-код. Также он позволит нам редактировать запись, если нам понадобится изменить какую-либо переменную. Просто разместите этот код в цикле.

<h1 class="entry-title"><?php the_title() ?></h1><br />

<?php
echo "<strong>". _x( 'Description:','description label') . "</strong> ";
echo display_description();
echo "<br />";
echo trackable_url_report();
echo "<br />";
echo "<strong>". _x('Trackable URL:','trackable URL label') . "</strong> ";
echo "<a href=".trackable_url()." target='_blank'>".trackable_url()."</a><br />";

echo "<strong>" . _x('Shortened Trackable URL:','shortened trackable URL label') . "</strong> ";
echo "<a href=".trackable_url_tiny()." target='_blank'>".trackable_url_tiny()."</a><br />";
?>

<br />
<img src="https://chart.googleapis.com/chart?chs=150x150&amp;cht=qr&amp;chl=<?php trackable_url_tiny(); ?>" /><br />
<?php edit_post_link( __( 'Edit', 'twentyeleven' ), '<span class="edit-link">', '</span>' ); ?>

Когда мы объединим весь код, шаблон кампании будет выглядеть следующим образом:

<?php
/**
* The Template for displaying all single posts.
*
* @package WordPress
* @subpackage Twenty_Eleven
* @since Twenty Eleven 1.0
*/

// Include the ga-functions.php file so that we can easily display the results
include_once('ga-functions.php');

get_header(); ?>

<div id="primary">
<div id="content" role="main">

<?php while ( have_posts() ) : the_post(); ?>

<nav id="nav-single">
<h3 class="assistive-text"><?php _e( 'Post navigation', 'twentyeleven' ); ?></h3>
<span class="nav-previous"><?php previous_post_link( '%link', __( '<span class="meta-nav">&larr;</span> Previous', 'twentyeleven' ) ); ?></span>
<span class="nav-next"><?php next_post_link( '%link', __( 'Next <span class="meta-nav">&rarr;</span>', 'twentyeleven' ) ); ?></span>
</nav><!-- #nav-single -->

<h1 class="entry-title"><?php the_title() ?></h1><br />

<?php
echo "<strong>". _x( 'Description:','description label') . "</strong> ";
echo display_description();
echo "<br />";
echo trackable_url_report();
echo "<br />";
echo "<strong>". _x('Trackable URL:','trackable URL label') . "</strong> ";
echo "<a href=".trackable_url()." target='_blank'>".trackable_url()."</a><br />";

echo "<strong>" . _x('Shortened Trackable URL:','shortened trackable URL label') . "</strong> ";
echo "<a href=".trackable_url_tiny()." target='_blank'>".trackable_url_tiny()."</a><br />";
?>

<br />
<img src="https://chart.googleapis.com/chart?chs=150x150&amp;cht=qr&amp;chl=<?php trackable_url_tiny(); ?>" /><br />
<?php edit_post_link( __( 'Edit', 'twentyeleven' ), '<span class="edit-link">', '</span>' ); ?>

<?php comments_template( '', true ); ?>

<?php endwhile; // end of the loop. ?>

</div><!-- #content -->
</div><!-- #primary -->

<?php get_footer(); ?>

Когда шаблон настроен и кампания добавлена, мы увидим следующую страницу.

Заключение

С помощью использования произвольных типов записей, существующих в WordPress, можно организовать маркетинговые кампании с URL-адресом, позволяющим вести их отслеживание в Google Analytics. Такой подход позволяет сделать маркетинговые кампании более простыми и эффективными.

Произвольные типы записей заметно облегчают настройку системы организации контента. Мы всегда можем проявить творческий подход при создании произвольных типов записей. Эти произвольные типы могут оказаться очень полезными в том случае, если организация контента выходит за рамки нормальной структуры WordPress или иных систем управления контентом.

По материалам smashingmagazine.com

Блог про WordPress
Добавить комментарий

Получать новые комментарии по электронной почте.