Are you Working on Marketing Outputs, or Outcomes?

Are you Working on Marketing Outputs, or Outcomes?

During a recent conference, I spent seven hours with local entrepreneurs, marketers, and PR professionals sharing first-hand experiences around marketing challenges and how they solved them. One of the main topics was digital trends and what we, as content producers, should know.

One speaker who really stood out for me was the charismatic Wil Reynolds, Founder and Director of Strategy at SEER Interactive, a digital marketing agency specializing in SEO, PPC, and Analytics.

Wil challenged the group to to ask themselves if they were working on marketing “outputs” or “outcomes.”

What did he mean?

We all get so caught up on making sure we are meeting certain bars or KPIs in terms of numbers and metrics – how many articles did we get mentioned in? How many media impressions did we secure? Did we get more clicks than last month? How many page views did we get? How many more followers?

These are all metrics that PR and digital marketing professionals are expected to report against, on a daily, weekly or monthly basis; and when our numbers are where they are supposed to be, it’s easy to think “hey, we are doing what we are supposed to do, and all is good.”

But at the end of the day, how do all of these metrics translate to customers and sales?

What so many of us forget to do is close the loop on our PR and marketing efforts. Did those extra followers lead to a new prospect? Did the articles you secured get placed in the publications that your customers read? Has our new messaging come across in our media placements? In other words, did all of our efforts result in actually “moving the needle” against our goals?

Wil continued, “In our business, we need to think like a child and ask “why” at least five times to everything we do, to get to the root of the problem. If we don’t know WHY we are doing something, or have any way to measure its effectiveness, then we are just going through the motions and wasting precious time, money and resources.”

So, as you look at your marketing mix, be critical. Don’t just “do”. Ask yourself why are we doing this and how is it going to translate into meeting our business objectives? That’s how you deliver more strategic outcomes, not simply outputs.

By Colleen Martin, Director

Book report: Tips for social media success

A review of social media-pro Guy Kawasaki’s book, “The Art of Social Media”

Sure, you’re engaging in social media efforts for your clients, but are they reaching the right people? Did they make any impact?

If you are already implementing, or are planning to implement, a social media campaign, Guy Kawasaki is a name you need to know. Formerly an advisor at Google and Chief Evangelist at Apple, Guy is an authority on all things social media.

In his book, “The Art of Social Media”, Guy outlines best practices and tips that all circle back to the main focus: Are you earning the right to promote?

What does that mean? It’s easy to share your latest news article or link to your event, but what does that offer your audience? That’s right: little or nothing. It’s too promotional.

Guy uses the example of NPR. Every day of the year, NPR offers commercial-free, quality news, which provides a true value to its listeners. It’s for that reason, a few days per year, they are able to run a pledge drive. NPR has earned the right to promote the drive with 363 days of uninterrupted, respected content.

“The Art of Social Media” uncovers various ways to make sure that you are continuing to provide new, and useful content.

One example is using curation and aggregation services – many of them are free and can provide a wealth of articles and the latest studies to share. Examples that Guy provided include: Alltop, Buffer, Feedly, Google Scholar, LinkedIn, NPR, and Reddit.In addition to these tools, it can be helpful to set up Google alerts on key terms: competitors, industry hot topics, etc. This way, you receive up-to-the-minute information that is worth sharing.

Once you have the content, the next step is to share. There are best practices in how to craft posts for the various channels.

  • Be brief: Posts on Google+ and Facebook should be 2-3 sentences and Twitter has a limit of 140 characters, but 100 characters is really the best practice.
  • Be visual: Every post, no matter where it is, should contain “eye candy” in the form of a picture, graphic, or video. According to a Skyword study, views of a client’s content increased by 94% if a published article contained a relevant photograph or infographic.
  • Be sly: Use key phrases that let readers know they are about to get useful and practical information (i.e. “How to rock___, Quick guide to ___, Essential steps to___)
  • Be active: While this seems obvious, it’s one of the most important tools. Don’t be afraid to repost the same exact post a few times per day. According to Moz, the prime lifetime of an average Tweet is only 18 minutes! It’s much more likely that you’ll gain new followers, retweets, likes, etc. by posting the same content multiple times than it is you’ll lose any due to annoyance.

By Alyson Kurtiz, Strategist

Best Practices: Writing Website Copy

As content marketing continues to drive many of today’s integrated marketing programs, perfecting writing skills for the various marketing channels has never been more critical. Copy for a brochure is not the same as copy for a press release, white paper or social media.

Copy development for a website has its own voice or tone. The great part about web copy is that it can be changed and adjusted on the fly and new messages and call to actions can be tested dynamically for each campaign or target audience. The hard part about web copy is that you need to think about the SEO implications of the text and how what is put on each page affects the visibility of a website or web page in a search engine’s “organic” (un-paid) search results.

SEO is an animal. It is dynamic, always evolving, and quite frankly one of the most technical and, as a result, more difficult aspects of digital marketing. SEO can also often be overlooked. This is often because the role of keeping up with the SEO best practices resides with many people from both technical teams and content developers. There are standard best practices today that, no matter who your audience is or the purpose of your site, should be applied if you are looking to attract visitors.

Off-page SEO: Linking & Content Marketing

Websites can be optimized through activity that does not even occur on your site. For example, links from third parties in media placements or links from partners can drive additional, credible traffic.

Additionally, third party content that results from a contributed article, a blog post on another site, a video or social media, could also drive traffic.

Research: Targets & Keywords

Compiling web copy can be a daunting task. However, what you say is just as important as how you say it.

As with every marketing channel, copy that is optimized for SEO takes into account the target audience or audiences. Identify the audience the pain point they are looking to solve and what unique benefits will drive interest in your product or service. These benefits and differentiators will inform calls to action that are effective and create engagement.

Traditional SEO copy writing focused on keywords. However, these are usually way too broad and have too much competition – the result: you’re lost.

Today, it is best to optimize keyphrases for long tail search queries in order to attract highly targeted traffic. This takes time and research to identify the most popular and common phrases.

In addition to keyword and keyphrase research, Google Adwords provides valuable ranking and insight into the popularity of terms, helping to formulate intelligent decisions on what phrases and words to incorporate on the web page copy.

Technical Aspects of SEO Copy

While dated, the Google SEO Starter guide is a great source of information for the development of optimized content.

This guide breaks down important best practices on how to:

• Create unique, accurate page titles

• Make use of the “description” meta tag

• Structure your URLs logically

• Write better anchor text

• Make use of image alts

Metadata still plays an indirect role in optimizing SEO copy. Metadata is the information within thetag code that doesn’t get displayed on a webpage, but is used by search engines. Metadata influences Google’s and Bing’s algorithms directly. However, user behavior such as click-through rate and dwell time does. Meta descriptions factor into which results a user clicks.

Additionally, as the copy of the webpage comes together, keep in mind that the main body of the text is the most important – not the sidebars, headers or call outs.

Composing Optimized Copy

With the keywords identified and the plan of attack outlined, it is time to start composing the text for the webpages.

For each page, target 2-3 keyphrases, include headers (with keyphrases incorporated), and give headers hierarchical structure. In the body of the copy, weave in keyphrases, synonyms and natural variants.

Implementation

Check your work. There are plug-ins available to verify and confirm that best practices are intact, such as Yoast for WordPress. Yoast is installed during development, manages on-page SEO and publishes XML sitemaps for search engines to crawl.

Once your site is developed and ready to launch, run a pre-launch check to make sure everything is ready to launch.

Now you’re ready to be found!

The Do’s and Don’ts of Writing for SEO

Launching a new website? What is your copy saying? Print this out and make sure you are following these simple rules. Best practices go a long way and can dramatically impact your site’s visibility.

Do:

  • Vary sentence structure to have a combination of longer and shorter sentences for rhythm. Keep sentences under 30 words.
  • Keep paragraphs short and break them into logical sections with headers. Readers need the white space for legibility. Headers also help a page look more visually interesting and are easier to scan. This goes double for mobile view!
  • Use bullets to break up paragraphs and help readers scan list info quickly.
  • Maintain the right tone for target readers.
  • Don’t copy sections of other websites in order to appear more content rich. You may be penalized.

Don’t:

  • Be boring
    • Attention spans are super short. The more readers you lose early, the more your SEO takes a hit. Be dynamic. Web copy isn’t a white paper. It has a mission—give readers what they need quickly and drive them to action.
  • Forget to answer questions
    • Visitors are coming to your site to answer a question, make sure you are answering it so they come back or engage more.
  • Create dead-end pages
    • There must be clear, focused calls to action on every page.
    • Primary CTA—get potential clients and partners to contact
    • Secondary CTAs—newsletter sign up, link to related content
Protecting WordPress Media Uploads Unless User is Logged In

null

Sometimes developing even the most simplistic solutions can be difficult. We have worked with several clients that have requested to keep their uploads folder private. While there are some plugin solutions that may assist in this – I figured I would post a simplistic way to do this manually to keep your code clean.

How does it work?
We will be modifying the .htaccess file in the root of your WordPress directory and telling it to redirect uploaded files if a user is not logged in. We will also add a redirect parameter to tell WordPress how to handle users so they will be correctly redirected to the file after logging in.
**Note: If you are using a custom plugin for front-end login screens (such as Profile Builder) you will need to modify the code a bit to pass a redirect parameter to that login screen, but this should give you a good start. **

WordPress and .HTACCESS
WordPress will generate an .htaccess file when you change your permalink structure. Because of this behavior, we need to make sure that we understand how to input custom htaccess rules in the file so that WordPress will not overwrite them when changing this structure. Let’s get into the code.
**Note: This tutorial assumes that you keep all your uploads in the same folder by unchecking “Organize my uploads into month- and year-based folders”. **

The code
Navigate to your .htaccess file via FTP in your WordPress root. If you do not see one – login to WordPress and update your permalink structure (Settings -> Permalinks -> Choose Post name). Now that you have an .htaccess file, edit it. We will be adding this code to our .htaccess file:

RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^wp-content/uploads/(.*)$ dl-file.php?file=$1 [QSA,L]

Make sure to add the code above the generated code that WordPress uses below (anything outside this WordPress will not touch).

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

Okay, now what?
Now we have control – we can do anything we want when an uploaded file is accessed. Each time an uploaded file is accessed we are telling it to run code we will create in a file named “dl-file.php”. Create a file named “dl-file.php” (without the quotes) in the root of your WordPress directory. Now, add this code inside the file to control our uploads:

require_once('wp-load.php');

If (!is_user_logged_in()){
$upload_dir = wp_upload_dir();
echo $upload_dir['baseurl'] . '/' . $_GET[ 'file' ];
wp_redirect( wp_login_url( $upload_dir['baseurl'] . '/' . $_GET[ 'file' ]));
exit();
}
list($basedir) = array_values(array_intersect_key(wp_upload_dir(), array('basedir' => 1)))+array(NULL);

$file = rtrim($basedir,'/').'/'.str_replace('..', '', isset($_GET[ 'file' ])?$_GET[ 'file' ]:'');
if (!$basedir || !is_file($file)) {
status_header(404);
die('404 — File not found.');
}

$mime = wp_check_filetype($file);
if( false === $mime[ 'type' ] && function_exists( 'mime_content_type' ) )
$mime[ 'type' ] = mime_content_type( $file );

if( $mime[ ‘type’ ] )
$mimetype = $mime[ ‘type’ ];
else
$mimetype = ‘image/’ . substr( $file, strrpos( $file, ‘.’ ) + 1 );

header( ‘Content-Type: ‘ . $mimetype ); // always send this
if ( false === strpos( $_SERVER[‘SERVER_SOFTWARE’], ‘Microsoft-IIS’ ) )
header( ‘Content-Length: ‘ . filesize( $file ) );

$last_modified = gmdate( ‘D, d M Y H:i:s’, filemtime( $file ) );
$etag = ‘”‘ . md5( $last_modified ) . ‘”‘;
header( “Last-Modified: $last_modified GMT” );
header( ‘ETag: ‘ . $etag );
header( ‘Expires: ‘ . gmdate( ‘D, d M Y H:i:s’, time() + 100000000 ) . ‘ GMT’ );

// Support for Conditional GET
$client_etag = isset( $_SERVER[‘HTTP_IF_NONE_MATCH’] ) ? stripslashes( $_SERVER[‘HTTP_IF_NONE_MATCH’] ) : false;

if( ! isset( $_SERVER[‘HTTP_IF_MODIFIED_SINCE’] ) )
$_SERVER[‘HTTP_IF_MODIFIED_SINCE’] = false;

$client_last_modified = trim( $_SERVER[‘HTTP_IF_MODIFIED_SINCE’] );
// If string is empty, return 0. If not, attempt to parse into a timestamp
$client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0;

// Make a timestamp for our most recent modification…
$modified_timestamp = strtotime($last_modified);

if ( ( $client_last_modified && $client_etag )
? ( ( $client_modified_timestamp >= $modified_timestamp) && ( $client_etag == $etag ) )
: ( ( $client_modified_timestamp >= $modified_timestamp) || ( $client_etag == $etag ) )
) {
status_header( 304 );
exit;
}

// If we made it this far, just serve the file
readfile( $file );

What exactly did we just do?
The first line of code

require_once('wp-load.php');

is just telling the PHP file to load the necessary files to call WordPress functions.

The next little snippet is the key:

If (!is_user_logged_in()){
$upload_dir = wp_upload_dir();
echo $upload_dir['baseurl'] . '/' . $_GET[ 'file' ];
wp_redirect( wp_login_url( $upload_dir['baseurl'] . '/' . $_GET[ 'file' ]));
exit();
}

We are validating that the user is not logged in (if you have certain users you need to restrict you can modify this). Since the user is not logged in, we will redirect the user to the login page. Once the user logs in, it will automatically redirect him/her to the file. Although some modifications were made to the code, original credit goes tohttp://wordpress.stackexchange.com/questions/37144/protect-wordpress-uploads-if-user-is-not-logged-in.

Hope this helps!

Travis Hoglund
Zer0 to 5ive Senior Developer

Gravity Forms: Submitting forms to 3rd Party Applications

If you develop websites in WordPress, there is a good chance that you have heard of Gravity Forms, a well-known plugin that allows you to implement forms very easily into your website.

How Does it Work?

Gravity Forms validates the data from the user, and stores it into the WordPress admin interface so you can log in and see who has submitted entries.

What is the Downside?

The only downside to Gravity Forms is that by default it does not give you an option to have a second “action,” as you have to send your forms to 3rd party software. However, with some simple coding, this can be remedied!

Adding a Second Action

Start by creating your form within Gravity Forms and adding it to a page. Once it is implemented correctly, you can start the process of adding the second action. First, we need to get the relevant ID’s of the Gravity Form fields. Open up your functions.php file (/wp-content/themes/*your-theme*/functions.php) and scroll to the very bottom, and add this code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
add_action("gform_post_submission", "set_post_content", 10, 2);
 function set_post_content($entry, $form){
 //Gravity Forms has validated the data
 //Our Custom Form Submitted via PHP will go here
 // Lets get the IDs of the relevant fields and prepare an email message
 $message = print_r($entry, true);
 // In case any of our lines are larger than 70 characters, we should use wordwrap()
 $message = wordwrap($message, 70);
 // Send
 mail('travis@0to5.com', 'Getting the Gravity Form Field IDs', $message);
 }

The snippet above will hook into all forms being submitted through Gravity Forms after submission (Replace travis@0to5.com with your relevant email).  After putting this in your functions.php file, go ahead and fill out your form. Make sure to fill in ALL fields with relevant data so that we can determine which fields are associated with which IDs.

You should receive an email that looks similar to this:


Sort out the relevant IDs to the relevant fields and write them down.  For example, my name is Travis Hoglund, so the first name field = 1.3, and the last name field = 1.6, etc.

Now that we know the field ID’s, we can implement a custom curl function to submit the data through PHP, just as it is sent through a browser. Below is the complete code – it might look like a lot, but I will explain it!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
add_action("gform_post_submission", "set_post_content", 10, 2);
 function set_post_content($entry, $form){
 // Lets get the IDs of the relevant fields and prepare an email message
 //$message = print_r($entry, true);
 // In case any of our lines are larger than 70 characters, we should use wordwrap()
 //$message = wordwrap($message, 70);
 // Send
 //mail('travis@0to5.com', 'Getting the Gravity Form Field IDs', $message);
 function post_to_url($url, $data) {
 $fields = '';
 foreach($data as $key => $value) {
 $fields .= $key . '=' . $value . '&';
 }
 rtrim($fields, '&');
 $post = curl_init();
 curl_setopt($post, CURLOPT_URL, $url);
 curl_setopt($post, CURLOPT_POST, count($data));
 curl_setopt($post, CURLOPT_POSTFIELDS, $fields);
 curl_setopt($post, CURLOPT_RETURNTRANSFER, 1);
 $result = curl_exec($post);
 curl_close($post);
 }
 if($form["id"] == 8){//Join Our Mailing List
 $data = array(
 "first_name" =>     $entry["1.3"],
 "last_name" =>     $entry["1.6"],
 "title" =>         $entry["2"],
 "company" =>     $entry["3"],
 "street" =>         $entry["4.1"],
 "city" =>         $entry["4.3"],
 "state" =>         $entry["4.4"],
 "zip" =>         $entry["4.5"],
 "country" =>     $entry["4.6"],
 "website" =>     $entry["10"],
 "email" =>         $entry["5"],
 "phone" =>         $entry["6"],
 "industry" =>     $entry["7"],
 "description" => $entry["8"],
 "formName" => "join-mailing-list-98368402345"
 );
 post_to_url("https://thirdPartyApplication.php", $data);
 }
 }

As you can see, I commented out the email code because we do not need this anymore.  If you have access to the third party forms, you will want to use software like Firebug (or you can just view source) and get the name attribute of each field.

1
2
<form action="https://thirdPartyApplication.php" method="post">
 <input style="" value="" id="field1">

I used Firebug to grab this snippet from my third party form. You will notice that the form is submitting to https://thirdPartyApplication.php so that is the value that must go in your code. Below that is the third party code for the First Name Field which has a name of first_name, so that is what it MUST be in the above PHP code if you want the third party to grab your POST variables correctly.

Most forms use hidden fields to determine what form is being submitted, so make sure you include them in your PHP code as well.  Here, the name and value are important:

1
<input type="hidden" value="join-mailing-list-98368402345">

As long as you make sure to include all of your form fields, use the correct IDs, and submit them with the relevant name attributes from the third party forms, you get the best of both worlds. Gravity Forms will validate your forms, save them to the admin interface, and your third party software will also receive them.

Happy Gravity Forms!

Travis Hoglund
Zer0 to 5ive Senior Developer

Spreading the Word on WordCamp Philly

November 5th marked the annual WordCamp Philly – a much-anticipated conference for designers and developers in the Philly area that use WordPress. WordCamp Philly is intended to be the premiere WordPress-related technical conference in Philadelphia, offering various seminars and sessions designed to grow and enhance your WordPress skills.

I signed up for WordCamp Philly, excited to attend and listen to the presentation given by Doug Stewart: Adding a Social ‘Stache: BuddyPress, bbPress And Beyond.

Doug Stewart is co-founder of the Philadelphia WordPress Meetup Group and an established BuddyPress developer – an expert, in my opinion.

Doug did a great job of explaining multiple benefits of adding these social applications, BuddyPress and bbPress, to your WordPress-enabled website.

Below are some notes from the presentation:

Why go social with WordPress and your website?

  • Increase capability and potential for user engagement
  • Encourage contribution for users
  • Make it easier for users to engage with content
  • Give “freshness” to a site
  • Increase a sense of ownership
  • Add a sense of community

Why use BuddyPress versus bbPress?

For smaller, simpler applications – use bbPress. bbPress is only a forum solution, meaning that it will only add forum capability to your site. Alternatively, BuddyPress offers a lot more features, including messaging and friend connections, but it is more complex.

Who uses bbPress: WordPress.org forums, WordPress.com forums, Dropbox Support Forums

Who uses BuddyPress: CUNY Academic Commons, Solo Practice University, hMAG, GigaOm Pro

Doug made a very valid point that you should not implement tools on your website that will not be used. If your community is small, it doesn’t make sense to implement friends, private messages, etc. Start with a forum and, as your community builds, implement new features that your community will love and utilize regularly.

bbPress – http://bbpress.org/

BuddyPress – http://buddypress.org/

Travis Hoglund
Zer0 to 5ive Senior Developer