Blog

The Four Don’ts of Security

Saturday, July 9th, 2016

Dear Customer:

We value you.  We think you are important.  We think your website is important.  We think protecting your domain name, email account, credit card details, and your site from being hacked (or worse) is important.

Because we know how important it is, and we know how upset you would be if your website were hacked, or your domain name were stolen, we have in place some policies that are to protect you.

Yes, they can be annoying.  Yes, they can slow you down.  But, they won’t slow you down as much as a hacked site, stolen domain, or hacked e-mail account will.

And they really only slow you down the first few times you use them.  Once you get in the habit, it’s not slower – in fact, it can be faster.

So please, follow these minimum security practices:

Note: While this is intentionally written to be humorous, the message is very serious.  This is not intended to be an exhaustive list of security practices, but rather to explain why we are so insistent on a few practices that we know frustrate our clients:

 

Don’t ever ever (ever!) email username / passwords.

Email is not secure.  It’s trivial for a hacker to intercept your email, snag those important credentials, and wreak some serious havoc.  This is not just a theoretical issue – read how one of our clients nearly had their domain name stolen a few years ago.

Please, send your credentials via LastPass.  If you cannot be bothered to do so, then at least call us with them.

But please, don’t send them via e-mail.

And that goes for all electronic message methods, too.  Don’t text them, Slack them, or IM them.  While some of those are more secure than others, none of them provide the level of security that your website and domain accounts deserve.

 

Don’t ever use the same password on multiple accounts.

Do you have a nice, “hard” password that you like to use on all of your accounts? Please don’t do it.

Why, you may ask? Because when one account is hacked (and it happens), then your password is known, and all of your other accounts become vulnerable.

If you use LastPass, using hard and unique passwords for every account you own becomes simple, because you don’t have to remember passwords!

 

Don’t use simple passwords.

We’ve got an article on how to create good passwords, but to be honest, your best bet is to use a password generator such as the one in LastPass.  It will create truly random passwords (something people are just incapable of), and you can control the length.  (Length is your friend when it comes to passwords – the longer the better!)

 

Don’t trust anyone.

This one is more theoretical than it is practical, but the principle is sound: When it comes to sensitive information, such as usernames and passwords that provide access to your most important website accounts, be ultra careful about who you trust.  This doesn’t just mean the people, it also means the services you use:

  • Don’t use Google Drive to store passwords.
  • Don’t store your passwords in DropBox.
  • Don’t trust just any “password manager”.  (See why we recommend LastPass).
  • Don’t give your passwords to people you can’t explicitly trust.

Realto Theme Plus dsIDXpress Plugin Results in Double Thumbnails

Friday, October 16th, 2015

We were recently approached by a client who was having a problem with a site they were building. They are using the Realto theme, plus the dsIDXpress plugin.

The site was experiencing double / duplicate thumbnails for the home slideshow, which is clearly a problem, especially since it caused the thumbs to not correspond to the correct slide.

Through some troubleshooting, we discovered that both the plugin and the theme are loading the jquery files for the Cycle2 slideshow. With two scripts running on the same slideshow, it caused this duplicate behavior. The solution was clear: remove one of the two scripts from being loaded.

Possible solutions included:
1. Removing / Commenting out the code that loads the script in the IDX plugin. (Bad plan, because the next time the plugin is updated, the code will re-appear, and the problem will happen again).
2. Removing/ Commenting out the code that loads the script in the Realto theme. (Also a bad plan, but less so than #1, since themes usually get updated less frequently than plugins).
3. Write a plugin to de-enqueue the script. This is viable and clean, but not ideal (more work, plus another plugin in the system).
4. Fortunately, the client was using a Child Theme, so we were able to use this clean / viable solution, without adding more plugins: de-enqueue the script in the Child Theme’s function file. (This would not have been possible if the client was not using a child theme).

For reference, here’s the code that we simply added to the child theme’s functions.php file:

add_action('wp_print_scripts', 'realto_cleanup_scripts');

function realto_cleanup_scripts() {
	 wp_dequeue_script( 'nt-jquery.cycle2.min' );
}

If you needed to make this a plugin, it would actually be a simple matter. Create a new file (no need to put it in a folder), title the file something like “realto-dequeue-script.php”, and add the below code to the file. Drop it into the wp-content/plugins folder, activate the plugin, and voila!

/*
Plugin Name: Realto Remove Cycle2 
Plugin URI: http://www.alphachannelgroup.com/
Description: This plugin de-enqueues the Cycle 2 slideshow script.
Author: Alpha Channel Group
Author URI: http://www.alphachannelgroup.com/
Version: 1.0
*/

add_action('wp_print_scripts', 'realto_cleanup_scripts');

function realto_cleanup_scripts() {
	 wp_dequeue_script( 'nt-jquery.cycle2.min' );
}

Pivotal Tracker vs Basecamp: Project Management Tools Tested

Wednesday, September 23rd, 2015

We have been using Pivotal Tracker successfully for project management for a few years, and have grown to find it an invaluable tool for staying in sync with customers on our projects.

We were recently asked to join Basecamp to work with a client on several projects.  At the time, I made the request that we use Pivotal Tracker, but was unable to articulate the difference(s) that made Pivotal Tracker our tool of choice.

After using both now side-by-side (which itself was one of the reasons I preferred to stick with Pivotal – having only a single Project Management tool open simplifies our world), I now have enough experience with both tools to offer some comparisons:

Full Disclosure

Straight out of the gate, I want to be sure I’m clear: I have a fairly strong bias towards Pivotal Tracker.  If you believe something is missing or inaccurate in this article, or I’m misrepresenting either one of these tools, let me know.  While my bias is strong, I want to be sure that my facts are accurate.

Overview

Both Pivotal Tracker and Basecamp provide support for multiple Projects.  Within each project, you can have distinct “Authorized Users” who are able to work within that project.  The primary feature that both of these tools offer is collaborative task management, including discussion, for each task.  We find this very powerful for allowing our team, as well as our clients, to see and participate in all of the tasks that may be going on with any given project.

Pivotal Tracker Interface

Pivotal Tracker Interface

Basecamp To-Do view

Basecamp To-Do view

Feature Comparison

FeaturePivotal TrackerBasecamp
Task Management
Tasks support sub-tasks
Assign Tasks to Categories / Types
Task Due Datesonly some task types
Tasks Prioritization
Assign Tasks to an Owner
Assign Task to Multiple Owners
Task Discussion
Multiple Users Tracking Tasks
Daily Recap E-mail
Robust Task Workflow
Tasks Grouping
Same Task in multiple groups
Pricing Based OnNumber of UsersNumber of Projects
Free Plan
Free Trial Version
Pricing$3-$6 per user$2 or less per project
($1.50 - $6 per GB storage)

Task Management

For Task Management, Pivotal Tracker uses what’s called “stories”.  A story is typically a task, but can contain sub-tasks as well.  The definition of what a story represents (project, task, etc) is somewhat up to the user.  Pivotal has an interesting approach to viewing / managing stories, which is basically a “column” view, where each column represents some meaningful grouping.  You can hide or show columns as it suits you – whether it’s a single column for “My Work”, or (as I typically run), three columns: “My Work”, “Backlog”, and “Icebox”.  I will occasionally also have open an Epic or Label column, if appropriate.  Pivotal allows multiple projects, and your view is preserved from project to project, so when you return to a given project, the view is exactly how you left it.  Each story collapses into a short box that contains the most relevant details, for quick scanning of stories.  Moving stories up and down within a column (to imply priority) sticks.  To view the details of a story, including discussion, attached files, etc. – you simply expand the story.  If desired, you can open a story to “full size”, so that it essentially takes the full height and width of the browser space.  But the column view is how I typically work – everything happens within this view – you can add, expand, move, discuss, etc. right within the view – and that way everything is in the “context” of the full project.

For task management, Basecamp uses a “To-do list”.  While there’s a few views that Basecamp offers, I find myself working within the top level “To-Do’s” view of any given project. Within this view, you can see all To-Do’s across all Lists, and either drill into a single To-Do, or into the To-Do List.

Sub-Tasks

In Pivotal, the stories include the opportunity to describe (and track) separate sub-tasks.  This becomes useful for tasks that grow to include additional auxiliary tasks, or include several sub-items that aren’t worthy of separate stories.

Basecamps To-do’s do not support sub-tasks, but can be emulated using To-Do “Lists”, so long as you did not want to use Lists for another purpose (see the “Task Grouping” section below).

Task Categorization

Pivotal stories also include a set of “types”, so that a story can be assigned to a “type” (bug, feature, chore, or release).  These have useful semantic meaning, and also expose different features around the story.  (For the usefulness of these features, see the “Task Workflow” section below).

Basecamp does not provide any categorization of tasks (it does support To-Do “Lists”, discussed further in the “Task Grouping” section below).

Task Assignment

Pivotal stories also include the ability to define multiple “Owners” (the “assignee” of the story).

Basecamp To-Do items can have a single owner.

Task Discussion

Pivotal Tracker provides an “in-story” discussion tool (called “activity”).  This activity allows the user to enter comments, questions, attach documents, and provides syntax / formatting using Markdown.  (Markdown is a set of convention that allows formatting.  For example, to bold a word, wrap it in two asterisks: **this will be bolded**, to italicize, wrap in single asterisks: *this will be italicized*.)  Markdown is convenient, but more complex markdown formatting can be intimidating until you become familiar with it.  Discussion is also supported at the “Epic” level (see “Task Groping” below for more information on Epics).

Basecamp supports discussion both within a To-Do, as well as at the To-Do List level.

Continue reading the “Following Tasks” section for further information about Discussion.

Following Tasks

Pivotal Tracker automatically causes the Story requester (which can be changed), as well as any story Owners, to be followers.  This means that any discussion for a story is automatically copied by e-mail to the requester / owner.  Additionally, Pivotal Tracker will allow anyone authorized on the project to “Follow” a story as well, which will cause them to be updated on discussion.   Lastly, when discussing a story in Pivotal, you can include anyone who is authorized in the project on discussion by citing them using the convention “@username”.  So, if I wanted John Smith on my team to be included on some communication, but he was not the requester nor an owner of the story, I simply drop his username in.  When you type the @ symbol and begin typing, Pivotal prompts you with the authorized users, so you can select quickly if desired.

Basecamp also automatically causes the To-Do creator (which does not appear to be changeable), and the To-Do assignee, to be followers.  Basecamp also provides a simple interface in discussion to check checkboxes to include authorized users on the discussion, as well as a convenient “Loop-in someone who isn’t on the project” to include someone outside of the authorized users if desired.

One thing Basecamp does that is nice is that they send a “daily recap” of activity.  No such feature appears to exist in Pivotal.

Task Workflow

As mentioned, Pivotal supports different story types (remember, a story is typically a task).  Each of these reveal different features around the story.  One of the more useful features is the workflow that is implemented for certain task types.  There are four task types: bugs, features, chores, and releases.  The workflow that bugs, features, and releases create are a “process” that makes a lot of sense: Before the story is started, it is in the “Unstarted” phase.  The owner of the story can then “start” the work, once they are done they can “finish” the work, but “deliver” it in a separate explicit step (which is useful for communication with clients).  Once a story is delivered, then it can be approved / rejected.  In our workflow, we typically ask the requester (the client) to review and approve / reject the work.  Pivotal does frustrate a bit in this area, though – the only story type that supports due dates are “releases”.  It would be nice to expose this option for other story types as well.

Basecamp To-dos do not provide much workflow.  When an item is complete, there is one step: check the checkbox to mark it complete.  You must explicitly ask for it to be reviewed, if desired, and if it is deemed inadequate / incomplete, you would un-complete the task to re-activate it.

Task Grouping

Pivotal Tracker accomplishes task grouping in a couple of interesting ways.  First, any story can have one or more tags (called “Labels” in Pivotal).  The label feature allows you to place a story into one or more groups.  Using the interface that Pivotal Provides, it is simple to view all stories that contain a specific label.

An additional feature of Labels is what Pivotal calls an “Epic”.  An Epic is a group of stories that are connected via label(s), and the epic itself can be followed by people that may not be owners / requester of the independent stories.  An epic supports discussion and a description in it’s own space, outside of the stories.

Basecamp provides To-do “lists” that allow you to group To-dos together.  These To-dos within a group are controlled simply by placing the To-do into the To-do List.  A To-do can only belong to a single list.  A To-do List does not support separate followers, but does discuss independent discussion.

Task Prioritization

Pivotal Tracker supports prioritization at several levels.  First, all Stories fall within one of three main columns: “Icebox” for work that is identified, but isn’t priority.  “Backlog” for work that is current and is priority, but not actively being worked.  And “Current” for work that is identified and underway.  Additionally, Pivotal allows for sorting (via drag-and-drop) within each column, to add another level of priority.  So long as the users agree it is so, the stories at the top of the list would be higher priority than those lower on the list.

Basecamp does not appear to directly support prioritization, but you can drop in a label (from 1 to 10) to use to provide prioritization.  Alternatively, each To-do could of course contain a number representing the priority, or Lists could be use to

Task Completion

This topic, while it is worth calling out separately, truly is covered under the “Task Workflow” section above.

Miscellaneous

There’s a few things that are worth mentioning that don’t really fall into neat categories.

Pivotal for some time has had an open forum thread about supporting simpler pasting of images.  As it stands, if you want to post a screenshot for example, you have to take a screenshot, save the file, then attach the file.  The attachment process is simple / easy enough, but the feature has been requested (and is available in other systems) to simply take the screenshot and paste it into the discussion.

Basecamp suffers from this same shortcoming.  You can only attach image files, not paste an image in directly.

Pivotal’s flexibility can also be an issue, particularly if one of your collaborators is not on the same page as you.  If they happen to move stories around (changing the priority), these changes will be reflected in the project, even if it isn’t being used the way you would prefer.

Pricing

Each system uses a different pricing model, and this is where Pivotal gets the biggest knock in my book (note: after reviewing Basecamp, they make the same mistake in pricing).  Their pricing system is punitive to companies as they grow, which is exactly opposite of what pricing models should be.  Their pricing model is based on the number of collaborators (users that can actually do something.  “Viewer” users are free).  On smaller plans (they have a useful “Free” plan), you are limited by users, file storage, and private projects.  Once you get over 10 users, the storage and private projects are unlimited – it’s purely a matter of users.  In several of their pricing steps, the more users you pay for, the more you pay per user.   We are currently milking our price point for 15 collaborators, because the next step is 2x the price, but only adds 10 more users (effectively taking us from $5 per user to $6 per user, with no steps between).

Basecamp on the other hand charges by projects and storage, with much more tolerable pricing points.  While they don’t have a free plan, they do offer a free 60 day trial period.  We would likely fall in the $50 per month plan (whereas we’re paying $75 for Pivotal, and really do need to upgrade to the $150 plan).  Unfortunately, the features we need simply aren’t available in Basecamp, and so we will continue to use Pivotal – despite their frustrating pricing policy. Interestingly, their pricing is also punitive, but around the amount of storage you purchase. Their “sweet spot” is the $150/month plan, where storage is $1.50 per GB, but go to the “Unlimited” plan, and storage jumps to $6 per GB.

One of the many things that Alpha Channel Group offers to all clients working with us is using Pivotal Tracker (for no charge) with any projects. We have determined it is well worth the cost, and will gladly cover the cost of putting your projects on Pivotal Tracker, so that we can stay in sync on all of our work together.

One of our Customers Domain Name Was (almost) Stolen

Thursday, July 9th, 2015

One of our customers narrowly avoided completely losing their domain name.

Their domain was a short, 4-letter, .com, high-quality domain name that they had paid a 4-figure sum to own.  Stolen.

Actually stolen.  Only by the grace of God did they end up getting it back.

Here’s the story of what happened, how it was discovered, and how they managed to get it back:

We have a problem…

One day we logged into the customer’s hosting account (where their domain was also registered), only to discover that some of the information appeared to be “off”.  We contacted the customer by phone, and asked if they were making these changes, and they indicated they were not.  We advised them that this was dead serious, and an urgent issue, because if they weren’t making the changes, then their account was in jeapardy.  At that time, we thought that their website maybe being hacked (we weren’t aware that their domain name was also registered there).

The domain is gone…

We stayed in fairly steady contact with the customer, who, after contacting their host provider, discovered that the domain name was already in the middle of transfer to a different registrar (GoDaddy).  With access to both accounts – the customer’s account and their own GoDaddy account (which the bad guy had) – they have everything they need in order to transfer a domain name.

The effort to get it back…

The customer threw one of their staff members into resolving this full time.  He ended up spending nearly a month, full-time, working on the problem, and finding a solution.  They contacted the FBI, GoDaddy, their host provider – anybody who might have the authority to stop / reverse the transfer.

GoDaddy agreed to “freeze” the domain when it arrived, and not allow it to be pointed to different hosting or email.

The FBI couldn’t do much at all to help.

The host provider (who we do NOT recommend) was essentially non-responsive.

Who’s responsible?

And guess what? The customer asked us a lot of questions that suggested they thought that we might have been responsible for their account information being leaked.  Thankfully, at that time we had solid practices in place for securing our customer’s sensitive credentials, and we could say with confidence that there was no way we had leaked the information.

Finally getting it back…

How did they finally get the domain back? The answer is surprising: Social Media.  The customer, after literally a month of working every angle they could think of, with no result, finally made a move that got their domain back.  They had built a decent social media following, so when they called out the CEO of their hosting company via Facebook, they got some attention.  Within minutes of the posting, the hosting company became very responsive, worked directly with GoDaddy, and got the domain name back (which HAD been successfully transferred, but thankfully GoDaddy had “frozen” the domain while this was being resolved).

How did it happen?

And how did this all happen? After defending ourselves and explaining our security practices, the customer seemed satisfied that it was not us that leaked the information.  And after doing some more digging, they discovered how it had been leaked:

One of their staff was traveling overseas.  Working on his computer, he was emailing with the home office.  They emailed some sensitive information, and their emails were intercepted by a bad guy.  And with just a couple of pieces of sensitive information, and the wealth of information you can get from the internet, that bad guy had everything he needed in order to (almost) steal their domain name.

 

Alpha Channel Group gets Rebranded

Friday, June 19th, 2015

We are excited to announce that we are going through a rebrand process.  We are delighted to be working with Justen Hong at Visual Lure – in our estimation, a world-class graphic artist.

We’ve got our first piece: a new logo.

The new logo simplifies the name, is more modern, and is more representative of what our company does.

The final versions we selected:

HorzBlueColorLogo

 

logo-485x60

 

VertBlueColorLogo

 

We’re looking forward to a completely new website sometime in the next few months.

 

 

Migrating a Single Site from One WordPress MultiSite to Another

Tuesday, October 28th, 2014

For Developers or Power Users

Warning: This article is designed for developers, or the technically experienced.  You should be comfortable working in databases, and utilizing FTP.

Overview:

We need to move a single site from within a WordPress MultiSite to another WordPress MultiSite.  The site is completely set up, including plugins, widgets, theme options, and other settings.

We want to preserve as much of the data as possible, without hosing the complete installation.

Note: for convenience sake, we used the following terms:

Source Install – the original site, that we are moving somewhere else

Target Install – the new site location, where the source site will be moved.

Steps:

None of the import / export that we have found tools cover this scenario, so we have developed a process:

  1. Set up the new site in your Target MU Install.  Take note of the site ID (prefixed in all of the database tables).  This will be referred to as the Target Site ID.
  2. In your existing Source Install, take note of the site ID.  This will be referred to as the Source Site ID.
  3. By accessing the database (for example, using phpMyAdmin), export the tables in your Source Install.  Only export those that pertain to the single site.  They should contain the site ID, for example “wp_3_options”.
  4. Make a comprehensive list of all relevant plugins being used in your Source Install – remember, there’s “network activated” plugins as well as “site-specific” plugins.
    1. FTP the plugins from the Source Install.
    2. FTP the theme from the Source Install.
    3. IMPORTANT: Prior to uploading the database, or trying to visit the site, it’s imperative that all of the plugin / theme files exist on the Target Install.
    4. FTP the plugins and theme to the Target Install.
  5. Open the SQL export file created from step 3 above in your favorite text editor.  Update all table names to reflect the Target Site ID.  Also change them to reflect the table prefix of the Target Install.
    1. Example: if the  Source Site ID is 3, and the Target Site ID is 5, and they both use the same table prefix of “wp_”, then you would find all table names and change them according to the following model:
      1. “wp_3_options” would be updated to “wp_5_options”.
    2. If the table prefix in the Source Install is “wp_'”, and the table prefix in the Target Install is “38921_”, then the example would look like:
      1. “wp_3_options” changes to “38291_5_options”.
    3. We are only using the options table as an example.  Currently there are 9 tables in a WP MU “site”, plus there may be additional tables depending on plugins or your theme.
    4. IMPORTANT: If you aren’t familiar with table prefixes, or any of this seems off, then we recommend you consult with someone familiar with WordPress, particularly Multi Site installations.
  6. In your Source Install, run the following query on your posts table to get a listing of all media / attachments that will need to be manually moved using FTP:
    1. “SELECT * FROM `wp_3_posts` WHERE `post_type` = ‘attachment’
    2. This will list all of your attachments.  This will help you ensure that you know all of the attachments that need to get moved.
    3. Check the source wp-content/uploads folder for a “sites” sub-folder. There should be a sub-folder that is named the same as your site ID, such as wp-content/uploads/site/3.   This would be the media for your specific site.
    4. Using FTP or rsync, move the contents of the uploads folder (wp-content/uploads/sites/3) to your target install (wp-content/uploads/sites/5).
  7. Import the SQL file that you have altered into the Target Install database.

If the site domain is changing, then the following steps may be required.

  1. Run the searchreplacedb tool on the Target Install database to update the site.  Be sure to only select the tables in your migrated site – not the entire database!
  2. After running searchreplacedb tool (available here), you may need to run it again to clean up certain paths.  These may be true for image folders, particularly if the new domain has a path in it, such as :www.mydomain.com/subfolder
  3. If the site domain is changing and you are getting 404 errors when you view the site, you may need to flush the rewrite rules. In a non-MU install, this is done by going in the dashboard to the “Permalinks” page and simply clicking “Save”.  In an MU installation, the only way we are aware of is to deactivate and reactivate the theme.

Test and Tweak

As with anything, some good testing is likely in order.  We have found that the most likely place for mistakes to happen is when running the searchreplacedb tool – be sure the new urls are correct.

 

Notes for future updates:

 

Import External Images plugin

Copy / FTP files from uploads/sites/[Site_id]

run SRDB2 to update images loading from proper site ID.

Transferring Files Directly from One Server to Another

Wednesday, May 28th, 2014

All I can say is:

Macs are awesome.

And so is Transmit, the File transfer software I have been using.  I was a big fan of FileZilla, but since migrating to my Mac, some limitations in the Mac version caused me to go looking elsewhere.

Enter Transmit.

So, I really needed to transfer files from one server to another.  In the past, I would download the files to my machine, then upload them to the target server.

Just for fun, I tried something a little different in Transmit:

First, I opened a window with my target server connection.

Then, I opened a new second window, with my source server connection.

And then, I just hilighted the files from the source, and dragged them into the target server window.

To my surprise, Transmit took off like a racehorse, uploading the files directly from my source server to my target server.

Now granted, it may be that it’s transparently downloading them and uploading them, but that’s OK – it’s doing it transparently, which means I don’t have to watch it, worry about it, or get in the middle in any way.

Why “Welcome To My Site” stinks

Tuesday, May 27th, 2014

And other observations about web site conversion rates

I am a subscriber to the Monday Morning Memo – and if you are interested in conversion rates, then I encourage you to subscribe as well.

For years now, I’ve been pushing people to change their headlines on their website.

You have a few, brief seconds to engage your visitor, and if you waste the first 3-5 seconds on “Welcome to my Website” you have just wasted 80% of your ad budget.

80% comes from a quote from David Ogilvy, decades ago:

On the average, five times as many people read the headline as read the body copy. When you have written your headline, you have spent eighty cents out of your dollar.

Write your headline carefully.  You have mere seconds.

Write a headline that does three things well:

1) Gives your visitor the right “scent”.  They followed a scent when they came to your site – whether it was a Google Ad, an organic Google listing, or a referral from a friend – and your headline needs to confirm that scent.  It should say “You are in the right place – what you are about to read is what you were looking for”.

2) Teases them with an answer to every visitor’s question: WIFM (What’s In if For Me?). Every visitor wants to know this.

3) Is visitor-centric, and passes the “we-we” test.  “We We” is a measure of how much your site talks about you and your company versus how much it talks about your visitor, the benefit they can expect, and the value they will receive.

A good headline gets the visitor to spend a few more seconds on your site, and potentially start reading your body copy.

Write for Skim-n-Scan Readers

My consistent recommendation is to write for “skim-n-scan” readers. Your copy doesn’t need to be short (people will read, contrary to popular opinion) – but it does need to be structured well, interesting, and compelling.

Skim-n-scan readers will not ready every word.  Rather, they start scanning the page – when they see something that interests them, they slow down and start skimming the copy.  If it’s truly interesting and engaging, they may slow down and read – but probably not for long.

Use effective subtitles, bold key phrases, and keyword-rich links (which also benefit SEO) as techniques to give those readers something to move quickly over.

Write shorter, easier to digest paragraphs.  When a visitor is scanning, most often they skim the first line of your paragraph.  More paragraph breaks gives you more chances to engage them in the top, and more importantly, prevents your point from being buried in a paragraph that is half a page long.

When writing for conversion, you’ve got to consider what your visitors are interested in, and speak to them in their language.  They don’t want to know about you – they want to know what you’ve got for them.  It’s not until they are convinced you have something to offer them do they want to know about you and your company.

Interested in more on conversion? Read our other articles about Conversion Rates.

Remove Duplicate Posts from Custom WordPress Loop

Tuesday, January 14th, 2014

How to: WordPress Remove Duplicate Posts Loop

In WordPress, sometimes you want to run multiple custom queries, but you don’t want the same post to appear in each query. This can happen when you want to feature posts in different categories, but a post may exist in multiple categories, so it is possible for the post to appear under each category.

This article describes the proper way to remove duplicate posts from multiple queries, so that the proper number of posts appear, and the same post won’t appear multiple times.

Find the file you want to edit, and before your custom query, declare a new variable:

/** This is where we are going to store the post ID's for the posts we've already displayed
 * Note: this resets the variable, so be sure to only include it once.
 * Also, if it's included in a template part, beware it may get called multiple
 * times, which would allow posts to be duplicated
 **/
$do_not_duplicate = array();

Then, inside your loop, add each post ID to the $do_not_duplicate variable:

$query = new WP_Query($args);
if ($query->have_posts()) {
    while($query->have_posts()) {
        // Add the post ID to the array
        $do_not_duplicate[] = get_the_ID();

        // Your code to display the post goes here...
    }
}

Finally, to bring it all together, when you are preparing your next custom query arguments, pass in the array into the post__not_in parameter, like so:

$args = array (
    'post_type'        =>  'post',
    'posts_per_page'   => '10',
    'post__not_in'     => $do_not_duplicate
);
$query = new WP_Query($args);

And there you have it! The posts from the second custom loop will not include any duplicates from the first post.

And, you can string this together for multiple custom queries. Just keep adding post ID’s to the variable, and using the post__not_in parameter, and you will be all set. (Note: do not put the first line in the code again, otherwise it will reset the variable, and you will begin getting duplicates again! This line: $do_not_duplicate = array(); resets the variable, so only declare this once at the top of the file).

ACG gets Responsive Web Design for Mobile Devices

Monday, January 13th, 2014

As a web development company, it only seems right that our website should have a responsive web design.

Allowing us to display the same content, utilizing the same markup, images, and styles, we simply added the appropriate media queries, made a few tweaks here and there, and now the site is responsive. It will display properly regardless of the device, or browser window size.

The only weakness in the way that we styled this is that you must be viewing it in Internet Explorer 8 or higher for it to respond properly. But, so long as you are using a browser at least 960 pixels wide, it will still display even in Internet Explorer 8.

While we tested on a variety of mobile platforms, one of the cool tools we used is the Web Developer toolbar for Firefox, which allows us to see the rendering in a variety of sizes quickly, in one page. Check out the screenshots below.

Responsive Web Design for Mobile

Firefox Web Developer tool allows us to see mobile versions of our Responsive Web Design

Responsive Web Design for Tablets

Firefox Web Developer toolbar allows us to see tablet views for our Responsive Web Design