Planet Drupal

Subscribe to flux Planet Drupal
Drupal.org - aggregated feeds in category Planet Drupal
Mis à jour : il y a 47 min 12 sec

Kristian Polso: Fix Drupal Registry with Registry Rebuild

mar, 08/07/2014 - 06:45
It has happened to all of us. You mistakenly remove a module directory or migrate your site and forget to include some necessary modules. This causes your Drupal site only to show the WSOD and perhaps the following error:
Catégories: Elsewhere

Drupal.org Featured Case Studies: Newstica

lun, 07/07/2014 - 22:51
Completed Drupal site or project URL: http://www.newstica.com

Newstica.com is an intelligent news reading application operated by a Canadian company. The website collects hundreds of news stories daily and creates a unique set of articles on each page view with the use of sophisticated algorithms that operate off individual users' preferences.

Key modules/theme/distribution used: PanelsViewsZenFeedsFeeds XPath ParserTeam members: highvrahos
Catégories: Elsewhere

Mediacurrent: Using Sass Breakpoints Effectively

lun, 07/07/2014 - 22:02

There have been plenty of blog posts touting the reasons to use Sass as a CSS preprocessor, and if you've been doing responsive design for a while, you're probably already using the Breakpoint gem with Sass. But there are many ways to use both of these tools, so let's talk about using breakpoints effectively. 

Start with the small screen first, then expand until it looks like sh*t. Time for a breakpoint!
- Stephen Hay.

Catégories: Elsewhere

Chuva Inc.: Entity Metathing what? -- A very brief introduction on entity_metadata_wrappers

lun, 07/07/2014 - 21:57

Are you familiar with entity_metadata_wrappers? If you’re not, oh boy, you should be!

Entity Metadata Wrapper is the right way - and, after you get the grip of it, the easiest way - for you to manipulate anything with a field when coding your module. Sure, since the old days of CCK we are used with dealing with our fields in our nodes. Except they are a little messy.

Cleaner code!

Instead of doing this:

<?php
$first_name = '';
if (!empty($node->field_first_name)) {
  $name = $node->field_first_name[LANGUAGE_NONE][0]['value'];
}
?>

Let’s condense that, shall we?

<?php
$node_wrapper = entity_metadata_wrapper('node', $node);
$first_name = $node_wrapper->field_first_name->value();
?>

Sure, the name “metadata wrapper” may be a little intimidating, but it does shortens your code and makes it clearer. Oh, and if you have an entity reference field, or a file field, you can just do this:

<?php
$image = $node_wrapper->field_image->value();
?>

And the $referenced_node is already a loaded file object, not a useless “fid”.

Wrappers for dealing with entity reference: cleaner-er code!

Suppose you have two node types: Employee and Department. There is an Entity reference field from "Employee" to "Department" and on the "Department" node you have a field called "field_dept_phone" that stores the phone number. (for simplicity, I'm assuming that field_employee_dept is required).

If you have the $employee node, how to fetch the phone number?

Hard way:

<?php
$phone = '';
$department = node_load($employee->field_employee_dept[LANGUAGE_NONE][0]['target_id']);
if ($department && !empty($department->field_dept_phone[LANGUAGE_NONE][0]['value'])) {
  $phone = $department->field_dept_phone[LANGUAGE_NONE][0]['value'];
}
?>

And the wrapper way:

<?php
$wrapper = entity_metadata_wrapper('node', $employee);
$phone = $wrapper->field_employee_dept->field_dept_phone->value();
?>

 

Now what?

Well, this post is not intended to be a full entity metadata wrapper course, so, if I have convinced you, take 15 minutes of your day and do this:

  1. Download Entity API from http://drupal.org/project/entity
  2. Read this, now: https://drupal.org/node/1021556
  3. Your life quality will improve, proportionally to your code quality!

Photo credits: https://www.flickr.com/photos/81564552@N00/3208209972/

PHPentityentity_metadata_wrappersdrupal planet
Catégories: Elsewhere

Drupal governance announcements: Shared Values and the Drupal Community

lun, 07/07/2014 - 21:50

Dries recently wrote a blog post about the challenges of fostering diversity and inclusivity in the Drupal community. This is the latest installment of a conversation that’s been going on for years.

In 2012, a group of Drupal community members worked together to draft a Code of Conduct that could be used to supplement the Drupal community’s Code of Conduct at DrupalCon and other in-person events.

This effort prompted a large (and sometimes heated) conversation that involved people from all corners of the Drupal community. This conversation was a difficult one, and many of us disagreed about many different things, but ultimately, we all agreed on several general principles:

We are a group of diverse people from a wide variety of ethnic, cultural, and religious backgrounds, and we embrace that.
Making all attendees feel welcome and included at DrupalCon is everyone’s job.
We treat each other with dignity and respect.
We take responsibility for our words and actions and the impact that they may have on others.

These principles informed the DrupalCon Code of Conduct, which was ratified by the Drupal Association in the summer of 2012 and has been used at every DrupalCon since.

At the last few DrupalCons, there have been a number of reported incidents, including groping, sexual harassment, physical assault, inappropriate comments made about female speakers, and more. While we are grateful that these incidents are being reported, even a single incident is too many.

In early 2013, the Community Working Group was chartered by Dries to uphold the Drupal Code of Conduct and to maintain a friendly and welcoming community for the Drupal project.

As a community, it’s important that we always keep our shared principles and values in mind when interacting with others, whether that be in person at DrupalCon, in the issue queues on Drupal.org, on IRC, or via social media. As the DrupalCon Code of Conduct states, the purpose is not to restrict the diversity of ideas and expression, but instead to ensure that there is a place for everyone in the Drupal community who agrees to abide by these basic principles.

Even when everyone has the best intentions, however, it’s inevitable that conflicts will occur. To ensure that these are addressed in a manner consistent with our shared values, the Community Working Group has worked with the community to develop a conflict resolution policy that lays out the process for addressing disagreements. This policy was developed by participants in the Community Summits at DrupalCons Prague and Austin, with additional review on Drupal.org.

This policy seeks to first and foremost empower individuals to resolve issues between themselves when possible, asking for help when needed, and only after that fails to escalate further. This approach gives people more control over their dispute and is the most likely to result in a positive outcome for everyone involved.

For matters that cannot or should not be resolved in any other way, the Community Working Group is available as a point of escalation. Incidents can be confidentially reported to the Community Working Group using the Incident Report Form. If the issue falls within the purview of the Community Working Group’s jurisdiction, we will then work with the involved individuals to find a remedy.

In her DrupalCon Austin keynote Erynn Petersen talked about how diversity is a key component of a healthy and productive community. While the Drupal community is one of the most diverse and welcoming communities in open source, we still have room for improvement. If you’re interested in joining us in that effort, let us know by responding to our call for volunteers or by participating in a Community Summit at an upcoming DrupalCon.

Actively supporting and maintaining a welcoming environment is something that every one of us in the Drupal community needs to be a part of, and it’s essential to the long-term health and growth of the project and community that we all love so much.

Catégories: Elsewhere

Károly Négyesi: Prejudices

lun, 07/07/2014 - 12:23

At Szeged, I asked a female Drupal contributor in Hungarian (I'm glad she did not understand) what was up with the coffee maker, because I readily presumed she was staff.
I saw one of the female geek role models at Austin with her baby. I got confused for a second, because apparently I think the übergeek and mother roles can't overlap.
On IRC, I almost said "Wow, that's impressive from a girl.".
I do not know how I can avoid these thoughts, but I am aware of them, I am bothered by them, and I try not to act on them. I also try to point out to fellow Drupalers when they act on their thoughts that these are not appropriate. I'm not sure what else I can do.
If you have good ideas on overcoming prejudice, please share!

Catégories: Elsewhere

DrupalCon Amsterdam: Convince Your Boss to Send You to DrupalCon Amsterdam

lun, 07/07/2014 - 09:00

Attending DrupalCon is a great investment in skills, professional development and relationships. And it's also a lot of fun!

Here is your chance to demonstrate the value of attending DrupalCon to your employer.

We’ve developed a set of materials to help you demonstrate the value of attending DrupalCon to your employer.

Why Attend DrupalCon?
  • Learn the latest technology and grow your Drupal skills
  • Build a stronger network in the community
  • Collaborate and share your knowledge with others

Resources About DrupalCon - includes program summary, demographics, budget worksheet PDF Letter to your employer template Word or GoogleDoc Trip report template PDF Request a Certificate of Attendance Available following the conference.
Catégories: Elsewhere

Károly Négyesi: Easier configuration development for Drupal 8

lun, 07/07/2014 - 00:56

With config_devel, when you are editing a migration, you can just enter the name of the file being edited at admin/config/config_devel and on every request the module will check for changes and import the file into the active storage. The other direction works as well: say you are working on a contrib module and have a view. Provide the path of the file (this time in the auto export box) and on every change Drupal will automatically export. Once satisfied, just commit. Or perhaps you just want to follow what's in a config file as it's being edited -- provide sites/default/files/some.config.name.yml and it'll be right there on every save.

Both import and export are doable manually with the config module core provides. But I think the automatism makes life easier and I hope the module will be popular among D8 developers. Finally, let me thank beejeebus for cooking up the module originally and handing it over to me despite he knew I will rewrite it from the ground up.

Catégories: Elsewhere

SitePoint PHP Drupal: The Drupal 8 version of EntityFieldQuery

sam, 05/07/2014 - 18:00

Even though Drupal 7 core fell short of a proper way of handling its brand new entity system (we currently rely on the great Entity module for that), it did give us EntityFieldQuery. For those of you who don’t know, EntityFieldQuery is a very powerful querying class used to search Drupal entities programatically (nodes, users, etc).

It provides a number of methods that make it easy to query entities based on conditions such as field values or class properties. If you don’t know how it works, feel free to check out this documentation page or this great tutorial on the subject.

In this article I am going to talk about what we have in Drupal 8 for querying entities. There is no more EntityFieldQuery, but there’s an entity.query service that will instantiate a query object for a given entity type (and that implements the \Drupal\Core\Entity\Query\QueryInterface). We can access this service statically through the \Drupal namespace or using dependency injection.

First up, we’ll look at querying node entities and then we’ll see how to load them. The same techniques will work with other content entities as well (users, comments etc), but also with configuration entities, and that’s really cool.

The entity query service

As mentioned, there are two ways we can access the entity.query service that we use for querying entities. Statically, we can do this:

Continue reading %The Drupal 8 version of EntityFieldQuery%

Catégories: Elsewhere

flink: Earl's chicken

sam, 05/07/2014 - 11:27

Here’s a little history I pieced together about, Drupal, the Views module and the human condition.

It must have been 4 years or so ago that the new Field API for D7 crystallises, requiring modifications to Views. So someone adds lines of code to make this happen. They don’t think much about those lines or the performance impact these may have. They don’t put a “hook” in to allow developers to alter the behaviour of those lines. Why would they? It’s a pretty trivial change. In fact it never crosses their minds to add the CPU cycles spent by that code to the view's performance stats.

4 years go by.

Nobody is aware that if you piled up the seconds collectively wasted in that code across all Drupal sites using Views over a period of 4 years, it would amount to like,…. like higher than the Eiffel tower. So to speak…

Until a couple of weeks ago some RdeBoer employs XHProf to find out why a client’s site is a little sluggish. And he finds those lines of code. And although there’s no hook as such to bypass those lines, he finds a way without hacking the Views module to neutralise those lines, offering a simple switch on the UI. Like a Turbo button, it makes selected Views run faster.

The customer is delighted. Now their site is finally speedy enough to go live! Another client quotes the results as “amazing”.

Encouraged by the happy customers RdeBoer tarts up his module to share it with the Drupal community. Now everyone can enjoy similar speed improvements. He writes a little blog post about it.

In a comment to that post @merlinofchaos confirms that those lines were indeed added with the introduction of the Field API. And that not showing how much time is spent in those lines is an oversight.

RdeBoer smiles. Takes a sip of his wine. 4 years... Isn’t life funny?

@merlinofchase goes back to the garden and throws another shrimp on the barbie. Metaphorically speaking. Might have been chicken. Have you seen Earl’s chicken? The photo above that’s his chicken. He cooked that last week. I would love a bit of that chicken. With its juices dripped over the veggies. Yummo!

Meanwhile @someViewsDude has a not-so-constructive go via Twitter, email and the module’s issue queue ...

My friend and colleague Susan concludes her writings with a beautiful phrase: “Breathe and do the next right thing”.

Maybe we can all sit around Earl's barbie. Try his chicken. It looks delish.

File under: Planet Drupal
Catégories: Elsewhere

Drupal 8 and iOS: Use Caching with NSURLRequest

ven, 04/07/2014 - 22:45
Use Caching with NSURLRequest

I am Vivek Pandya and I am working on Google Summer of Code 2014 project to build an iOS application for Drupal 8 site. In this article I am sharing my experience about caching retrieved data from Durpal 8 REST web service with in iOS7 application.

While writing iOS application that loads data(JSON) like a list of articles it is better to use cache mechanism provided by NSURLSession api. An NSURLRequest instance specifies how local cache is used by setting NSURLRequestCachePolicy values: with NSURLRequestProtocolCachePolicy, NSURLRequestReloadIgnoringCacheData, NSURLRequestReturnCacheDataElseLoad, NSURLRequestReturnCacheDataDontLoad etc.

The default cache policy for an NSURLRequest is NSURLRequestUseProtocolCachePolicy. While working with REST endpoint HTTP is default protocol so when NSCachedURLResponse does not exist for the request the NSURLSession will fetch data for that request.

If cached response exist than NSURLSession api will make HEAD request to the resource and check for cached data's validity by examining various response header like “Last-Modified” , “Cache-Control” etc. And if it finds data to be stale one it will load the data again otherwise returns cached data.

But, before using this cache mechanism at iOS side we have to make our Drupal site pages cacheable to do so navigate to “admin/config/development/performance” and set time limit value for page cache. Save the configuration. Now to verify whether Drupal has really enabled cache for pages or note try HEAD request with any REST api client like Postman, in response header you should be able to see “Cache-Control : max-age=<seconds>” here seconds should be same as you specified in configuration. See the picture below to get more clarity.

Now while creating request object with iOS SDK set it's caching policy to NSURLRequestProtocolCachePolicy. Now run the code , first time it will take normal time to load the data but next time onwards it will only reload the data if it has been changed or max-age value has expired.

For more details please refer to URLLoading system guide by Apple.

 

Tags:
Catégories: Elsewhere

groups.drupal.org frontpage posts: Drupal 8 core sprints, August 7-10

ven, 04/07/2014 - 15:56
Start:  2014-08-07 (All day) - 2014-08-10 (All day) UTC Sprint

Summer is in full swing, but we know you enjoy Drupaling with your peers in the summer as much as any other time of the year! Plus, this summer is an important time to help get Drupal 8 done, so there is no good reason to skip getting together. We are holding two Drupal 8 sprints at the same time on August 7 to 10: one in North America at TCDrupal, and one in Europe at Drupalaton. Sprinters from both events will collaborate on Drupal 8 issues.

Twin Cities DrupalCamp (North America)

Twin Cities DrupalCamp hosts a four-day Drupal sprint, with a focus on unblocking the release of Drupal 8 and other topics like multilingual, accessibility, and Drupal.org. The last day of the event provides a mentored sprint which is ideal for Drupalers new to sprinting or the issue queues. The camp itself features keynotes from Holly Ross and Chris Shattuck, free Drupal training on the first day, and five parallel session tracks on the middle days. The event is in Minneapolis and Bloomington, MN and the early bird ticket is $35. If you need funding to attend, contact the organizers.

Sign up for TCDrupal sprints Drupalaton (Europe)

Great location for a summer camp in an affordable hotel right on the beach of the biggest warm water lake in Europe (with a tiny private island), Drupalaton sprints provide a relaxed environment to work and have fun together. The camp programme focuses on providing longer hands-on workshops with featured speakers Ruben Teijeiro, Campbell Vertesi, Adam Juran and Gábor Hojtsy. The event is in Keszthely, Hungary and the ticket is 50 EUR. There is a funding pool for sprinters who would not attend otherwise; contact the organizers.

Sign up for Drupalaton sprints

P.S. Even if you cannot attend in August, keep in mind we have 9 consecutive days of sprints coming up in September in Amsterdam around DrupalCon.

#node-431758 h3 { display: none; } #node-431758 h3.content { display: block; }
Catégories: Elsewhere

Lullabot: DrupalCon Session Selection

ven, 04/07/2014 - 14:59

The session selection for DrupalCon Amsterdam has just been completed and will be announced next week. In this episode Addison Berry is joined by Steve Parks (steveparks), Pedro Cambra (pcambra), and Michael Schmid (schnitzel) to talk about how this actually works.

Catégories: Elsewhere

Makak Media: PhoneGap and Drupal 7 Data Synchronization for My Caribbean Offers App

ven, 04/07/2014 - 14:34

In our last blog post we launched the My Caribbean Offers app for Android and Apple iOS.

The app displays offers for all types of tourist related businesses from across the Caribbean and is currently free to download!

We thought we'd share what went into building the app, the modules used and processes involved.

Client side requirements

Phonegap with local database (SQLite in our case), jQuery for ajax operations (http requests)

Module requirements

Views, Services, Custom module to save node deletions

read more

Catégories: Elsewhere

LimoenGroen company blog: The power of sharing

ven, 04/07/2014 - 12:39
Scientia potentia est - Francis Bacon, 1597

Napoleon beat his opponents for years, despite his much smaller army. His knowledge of warfare and the armies of his opponents made him win the wars every time, and ultimately he was able to dominate Europe.

Knowledge is power > Sharing is power

The phrase "Knowledge is power" does not come out of thin air – where you could also explain power as influence, wealth or fame. However, in the knowledge economy of today is just having knowledge not enough. It becomes powerful when you can convey that knowledge. In the Open Source community we see that one who shares the most has the most "power". The real change agents, the core developers; they get done a lot because they not only know a lot, but also share this knowledge. And that goes in many ways: by writing a blog, giving a presentation, or simply just by contributing code.

Contributing code

Open Source is only good if people not only use it, but also improve it. Drupal is great software, but it has bugs. In the core itself, but (especially) in its thousands of community modules. If we discover a bug during a project we could fix this locally and continue with our work; our problem is resolved. However, we won’t. We always make sure that the solution flows back into the community. That can be done in several ways:

Contribute a patch

Can we solve the problem? Great! We create a new issue in the issue queue of the relevant module and deliver the code change as a patch. Example of Martijn: https://www.drupal.org/node/1783678

Describe the problem

Are we unable to fix it ourselves? Then at least create an issue and describe how the issue can be reproduced. This helps another developer to fix this, or recognize them their own problem quickly. Example of Dominique: https://www.drupal.org/node/907504

Start een nieuwe module

Did we write a separate piece of code that might be interesting for others? We’ll then try to offer this as a separate project. The extra time it takes to make a piece of client code generic and configurable is not an issue, knowing that the community as a whole can now help to improve and maintain the code for us. Example of myself, commissioned by the European Space Agency: https://www.drupal.org/project/commons_hashtags

Featured Drupal Provider

By sharing so much code we became one of the 4 Featured Drupal Providers in the Netherlands.

Taking equals giving

At LimoenGroen (Lime Green) everyone gets 10% community time: every other week, our employees have a full Friday to do what they think is important. They experiment with new technology, write a blog, or "open-source" customer code.

To make sure that the client agrees, we add the following boilerplate text to any quote that we write:

Drupal is developed under an open source software license. All, in the context of this project developed software falls under the same license as Drupal itself: GNU General Public License, version 2 or later. The intellectual property is yours. To take full advantage of the benefits of the open source development model, we believe it is important that we have the ability to develop parts of the software generic and share this with the community (with the mention that this is developed for <CUSTOMER NAME>).Appeal to Drupal suppliers

Taking equals giving is what I truly believe in. Therefore, I call on every Drupal supplier to include the text mentioned above in your offers. By doing so, there will soon be more to take! Who's with me?

Catégories: Elsewhere

flink: Drupal Views Accelerator

ven, 04/07/2014 - 06:46

When caching is not an option, Drupal sites employing the Views module may find their performances bound by it. Getting to the bottom of this issue on a number of sites we discovered that performance benefits are to be gained in unlikely corners of Views. We published a first version of the Views Accelerator module for everyone to reap those benefits. You’re invited to give it a burl. A couple of clicks on the UI could be all it takes to put a smile on the performance dial.

From simple to more complex analysis tools

Did you ever pay attention to that spinning circle while your browser is fetching your page? While that wheel spins anti-clockwise your browser is waiting for a reply from the server to your mouse click. Then as the server response streams in, the wheel reverses direction and the browser builds up your page. Details of each and every file processed during that phase and how long it took can be found under the Network tab of your browser console.
But when it comes to improving that left-churning part, no amount of browser analytics can help you. This is when you bring out the big guns. Like XHProf, or for D8, the Symfony-based WebProfilerBundle.
And you get ready to get your hands dirty, as you may have to dig deep.

When caching doesn’t cut it

But why take the trouble to analyse all this? Why not tell your customer to throw a pile of caching technologies at the under-performing site?
Because depending on the nature of your site, caching can be ineffective and even lead to functional errors.

The reason is personalisation/customisation.

Increasingly websites recall specific details about us to give us an enhanced browsing experience tailored to our preferences. Sites remember stuff we chose before. Brands, price ranges, travel destinations. Taking advantage of GPS/WiFi technology sites know where we are when we visit them. A map may place our current location at its centre and only show nearby points of interest — rather than the whole world.

Websites are moving from off-the-rack, one-size-fits-all to bespoke.

To cache is to assemble time-consuming pages once, to then dish out copies to everyone who ordered that same page. Caching does not cater for every guest bringing their own dietary requirements to the table.
Bespoke is indigestible to caching.

That’s when you have to take caching off the menu and look for alternative ways to speed up a site. So we cooked up Views Accelerator.

Identifying server-side slow spots

Tasked with making a customer site perform quicker we booted up XHProf. The culprit of slow performance was soon identified as a map featuring hundreds to thousands of nearby points of interest, centred on the visitor’s current location.

But it wasn’t any of the map engines or their APIs (Google, Openlayers, Leaflet) that were soaking up the seconds. Neither was it the database. It was Views. A little-known corner of Views.

Those familiar with the Views UI cockpit may know the tick box Show performance statistics on the admin/structure/views/settings page. With that checked, a preview prints out Query build time, Query execute time and View render time.

It’s like the developers of the Views module themselves felt those three numbers sum up all there is to Views performance.

But there is a fourth component… and it can slow your site down more than the other three together. XHProf proved it.

The performance opportunity

Between the query-execute and view-render phases, the code passes through a post-execute stage. This is where the raw results from the database are groomed for final rendering and theming. All results go through post-execute, even when this may not be necessary....

And with that we cue to the Views Accelerator project page. Featured there is a summary of a case study, proving how flicking on the module can boost Views speeds by 60%.

Views Accelerator is unconventional in its approach and is still in its infancy. Time will tell how the module matures in the community. We welcome feedback to help us improve the module.

Enable Views Accelerator on a test site. In Analysis mode it tells you how every view on every page you visit performs. Then in Accelerator mode it shows you those figures again. Hopefully the second time round those figures are a little leaner, making the user experience a little richer. If not, then your views may already be close to optimum. That’s reassuring too, isn’t it?

No gain, no pain. There is no reason not to give Views Accelerator a go.

Image taken from Time Magazine:
The $19 million Bloodhound SSC that is designed to shatter the world record on land with speeds over 1000 mph.


File under: Planet Drupal
Catégories: Elsewhere

InternetDevels: Migrate - module for data import in Drupal

jeu, 03/07/2014 - 23:00

Sometimes while website development it is necessary to transfer data from one database to another. Often it is either migration to a newer Drupal version (from 6.x to 7.x) or transfer of content to Drupal from another platform. Migrate module makes a very convenient tool for importing data in such cases.

Read more
Catégories: Elsewhere

Drupal Easy: Drupal Web Developer Career Series Part 2: Trailblazer Stories and Advice

jeu, 03/07/2014 - 22:28

This is the second of four (ok, it was three, but there is so much good information!) weekly blog posts that encapsulate the advice, tips and must-do elements of career building in the Drupal Community from the panel of experts collected for DrupalEasy’s DrupalCon Austin session; DrupalCareer Trailhead; Embark on a Path to Success. It will be listed with other career resources for reference at the DrupalEasy Academy Career Center.

-->

read more

Catégories: Elsewhere

Drupal core announcements: Drupal.org User Interviews: looking for core developers

jeu, 03/07/2014 - 18:44

Hi all,

I am looking for a few core developers, willing to take part in 45-60 minute user interviews next week. These interviews are part of the User Research we are doing now, they will help inform the future Drupal.org redesign.

If you have time and desire to talk to us about Drupal.org, let me know!

Thanks.

Catégories: Elsewhere

ThinkShout: Desire Paths, Part 2: Your Website is Telling You a Story

jeu, 03/07/2014 - 16:00

You want your website to tell your organization’s story. To do that, you need to listen to the stories your website is telling you.

I have the opportunity to work with a lot of great nonprofits, including one that supports women with breast cancer. While conducting a site audit, we noticed that they had higher mobile traffic than many of ThinkShout’s clients. It had grown from 5% of the site’s total in 2010 to 30% so far in 2014.

Digging a bit deeper, we found that many of the mobile visitors go directly to a section focusing on breast cancer in young women, including "survivor stories":

  • This section generated 50% of all pageviews for mobile users, as opposed to 27% of non-mobile traffic.

  • 73% of mobile site visitors came directly to these pages through search, as opposed to 44% of non-mobile searchers; visitors coming to the site through search on their computers largely landed on the home page.

  • Top search terms on mobile include "breast cancer stories," “breast cancer in young women,” and “young breast cancer survivors.” Those terms are 2 to 5 times more likely to have been used by mobile visitors than by those coming to the site on their computers.

Those numbers tell a story.

The news that you have cancer must come as a shock. Particularly when you’re young, it may seem to come out of the blue. It’s entirely possible that, when you first receive this jolt, you’re alone, having just left your doctor’s office or set down the phone.

The first thing I would want is some reassurance, confirmation at this juncture in my life that I’m going to be okay. Ideally, I’d talk to a loved one, but in the moment, I might turn to my smartphone: it’s immediately available, it’s connected, it could provide some answers.

Our client had created content that could meet that need, opening opportunities not just to reassure a key audience, but to connect them to a broader community of support and thereby further their mission.

By experimenting with layouts and calls to action specifically for mobile visitors – essentially, by doing our job – we have the chance to help people in a very real way.

And that’s why we all do this work, isn’t it?

Taking the time to create data-informed personas can help you hone a strategy for your content that goes beyond assumptions and guesswork.

Once you understand HOW users arrive at your site and examine WHAT they do after they get there, you can begin to parse out WHY they’re interested in your content in the first place – and implement the tactics that will tie their motivations to your organizational goals.

So, what are they doing?

As we’ve suggested before, a good website will nudge a visitor from her desire path – the reason she visited your site to begin with – to the desired path: a series of actions that will serve your organization’s mission.

It pains me to say it, but you need to start with a content audit. If you don’t understand what you have, you can’t understand how it’s being used.

Dozens of articles already cover site audits. Some of them even provide templates.

Don’t use them.

Or rather, use them in a way that serves your mission. Your website likely has hundreds or thousands of "pages" from highly trafficked to, sniffed at, forgotten, and abandoned. Microsoft once found that 30% of its webpages had never been visited. (That number is more impressive in real numbers: 3,000,000. Yes, three million pages essentially served no purpose at all.) More recently, an audit by the World Bank revealed that 31% of its reports had never been downloaded.

There’s always a reason a piece of content was added to your website. Somebody, at some point, thought it would be valuable. They may still have some emotional attachment to it.

Tough. Kill it.

Allyson Kapin recently pointed to a Harvard study that found that "the more complex a website is, the less appealing the website is to visitors." Microsoft discovered that removing poor quality content improved customer satisfaction. On a more basic level, psychologists have found that providing too many options can stall the decision-making process. When you go to the cereal aisle, do you want to spend time evaluating all of the possible cereal options? No, you just want the Golden Grahams. Everything else is a distraction.

When you put barriers in the way of your users, in the form of content they’re not interested in, they’re less likely to fight through to find the content they want. Yes, even if your organization thinks that content is central to your mission.

John McCrory created this handy dandy template to help you sort out what to keep and what to throw in the hopper:

If you need to run a full inventory, you might want to look into a tool like Screaming Frog or CAT (Content Analysis Tool). Or you can export reports from Google Analytics and combine it with data from social channels.

But you don’t need to care about everything. We suggest you:

1) Focus on your high-traffic content. You’ll need to decide what the cut-off should be, but in general, if a page represents less than .05% of your total pageviews, it’s probably not worth the time it takes to care about it. Your threshold may very well be higher than that.

You’ll want to analyze performance as well. Just because a page is heavily visited doesn’t mean it’s working the way you’d hoped. You may need to rewrite and reformat a lot of it. But there’s probably a reason people arrive there, and you should spend the time to figure out why.

On ThinkShout’s own site, for example, we know that there are a handful of older blog posts, mostly on technical subjects, that account for a high percentage of our site traffic. We’re not actively engaged in driving visitors to them, but they do present opportunities to encourage visitors to learn more about the work we do. For us, they’re old news. For our visitors, they may contain valuable information, and that’s a motivation we can tap.

2) Include any page in your site navigation, down two or three levels. Presumably, this content was once important to some stakeholder, somewhere. You may still cut it – hopefully, that stakeholder has already left your organization – but if it was important enough to include in your site architecture the last time around, you should try to understand why it’s there, even if it’s failing. This will help you not simply develop a strong argument to convince, say, your development director that her pet page is just getting in the way, but identify the pages that DO work and use them as exemplars to rewrite content deemed vital to the organization that may not be connecting with end users… yet.

3) Aggregate data for your primary content types. Task number one will catch that one event you did with Pharrell Williams in 2011 that still drives a lot of traffic to your site, but you probably have a certain number of content types – you can think of these as page "templates" – that handle the bulk of your content. You may have a blog, you may run events. If you’re already good at the structured content thing, you may have broken videos or media mentions into their own content types.

Kivi Leroux Miller talks about differentiating between your evergreen content (your main site pages, likely contained in your navigation structure) from your perennial and annual color (those blog posts and tweets). A lot of your content has a shelf life, so you need to make sure the wrapper keeps it as fresh as possible. Part of your content audit should examine how well the standard structure around your more temporal content is performing.

If you find that your audit still runs into hundreds of pages, Facebook’s Jonathon Colman has some great tips on how to use conditional formatting in Excel to highlight the areas that need the most attention. (Start on slide 131.)

Who’s doing it?

Now it’s time to tie content back to your users. You have a good idea how they arrived. By segmenting your traffic, you can study what they do next, all the way down to a page-by-page basis, if you’re feeling frisky.

A good place to start is the Google Analytics "Navigation Summary." This hidden gem of a report can be found under Behavior -> Site Content -> All Pages. In the upper left corner of the content, there are a series of tabs for “Explorer,” “Navigation Summary,” and “In-Page.” You want the middle one.

This report will tell you four things about any page on your site:

  1. How many users landed on this page ("Entrances")

  2. If it’s not a landing page, what their previous page was ("Previous Page Path")

  3. How many users exited from this page ("Exits")

  4. If they didn’t exit, the page they go to next ("Next Page Path")

Magic! But wait, there’s more. You can – and should! – use this page in conjunction with segmentation.

I don’t want to get bogged down in the details of Google’s Advanced Segments here. If you decide you want to take this on yourself, KISSMetrics has a good overview. Google itself made a slightly less helpful video.

When we begin a new project, we like to create segments that relate to the ways people arrive at a client’s site, in particular, engaged users.

You can define engagement in a number of ways: non-bounce visits, repeat visits, time on site – pretty much anything Google Analytics provides a metric for. If you have enough traffic, you can combine more than one of them to segment out a group of the highly engaged.

Combine engagement with mode and place of entry, and you’ll begin to flesh out your personas – and your content audit, if you set it up to track key audience segments for each top-level page. You might also consider using the information you generate in Page Tables for your evergreen content.

This sort of analysis sets the stage for much of the work we do here at ThinkShout. Getting back to the breast cancer organization, we created an advanced segment that looked only at mobile traffic, specifically mobile traffic that didn’t bounce (ie, they viewed more than one page).

Here’s what the segmentation looks like on the "Navigation Summary" report in the context of ThinkShout’s “Work” page:

We did this to answer two questions:

  1. If a visitor navigates on a mobile device to a particular page (or group of pages), and doesn’t bounce, what do they do next?

  2. How can we take advantage of that knowledge to try to capture the attention of more visitors?

By examining how the actions of engaged users differ from those you don’t capture, you can start to develop ideas about the calls to action, related content blocks, or other improvements to your information architecture that might make a particular group of users more likely to interact with your website – and your organization.

Next time, we’ll take a look at how you can make real improvements to your website based on the information you glean from your audience’s desire paths.

In the meantime, you can import three of ThinkShout’s commonly-used analytics segments:

You’ll likely need to edit these, based on your own URL structures, but they should be enough to get you started.

Catégories: Elsewhere

Pages