This slideshow could not be started. Try refreshing the page or viewing it in another browser.
WordPress in the Newsroom
About me: Mohammad (Mo) Jangda
- Code Wrangler at WordPress.com (Automattic)
- Core Contributor to WordPress
- Background in News, Publishing, Tech
- Ice Cream Fan
~22.5%
Percentage of top 10 million sites on the web that use WordPress
(up from ~18% last year)
(~29% of all new websites)
Some of the biggest names in media, business, and government
New York Post
TIME.com
Quartz
Re/code
It’s hip to be WordPress
But do you really know and use WordPress to its potential?
Most Important: Stay Secure
– Keep your WordPress updated
– Use a strong password (or a Password Manager)
– User two-factor authentication
– Make sure your team does the same!
Structured Data
WordPress is a semantic publishing platform.
Custom Post Types
A custom post type is nothing more than a regular post with a different
MARKDOWN_HASH01b0357bbb461420eb0aced7e3c2fcb9MARKDOWN_HASH
value in the database. The post type of regular posts is post, pages use page, attachments use attachment and so on. You can now create your own to indicate the type of content created. You could create custom post types for books, movies, reviews, products, and so on.
— Smashing Magazine (http://wp.smashingmagazine.com)
Custom Taxonomies
WordPress’ custom taxonomies make it possible to structure large amounts of content in a logical, well-organized way. In WordPress, categories are set up as a hierarchal taxonomy, and tags are set up as a multifaceted taxonomy […] A large news organization could organize its content by world region (Africa, Asia, Europe, Latin America, Middle East, US & Canada), as the BBC does in its “World” section.
— Smashing Magazine (http://wp.smashingmagazine.com)
Post Metadata
WordPress lets you add arbitrary metadata to posts. Movie Ratings. Pull quotes. Geolocation.
Media: Easy Embeds
HULK NOW A JOURNALIST FOR FREEDOM! HULK SMASH LIES!
— Journalist Hulk (@iiefhwpi23hdkwd) January 10, 2011
Go Mobile
Make the mobile app a pre-requisite for all your editors and reporters.
Mobile + Real-time
Liveblogging from the field
Real-time + Curation
LivePress, ScribbleLive / CoverItLive
Curation: Zoninator
Drag-and-drop-based control
Getting Social
Comments, Sharing, Publishing
Web-first Workflows
WordPress is your central hub and content store.
Plugin: Edit Flow
Edit Flow gives you custom statuses, a calendar, editorial comments, and more, all to make it much easier for your team to collaborate within WordPress.
Edit Flow: Calendar
A convenient month-by-month look at your content
Edit Flow: Custom Statuses
Define the key stages to your workflow.
Edit Flow: Editorial Comments
Threaded commenting in the admin for private discussion between writers and editors
Edit Flow: Everything Else
- Notifications – Receive timely updates on the content you’re following.
- User Groups – Keep your users organized by department or function.
- Editorial Metadata – Keep track of the important details.
- Story Budget – View all of your upcoming posts in a more traditional story budget view, and hit the print button to take it to your planning meeting.
Knowledgebase: WP-Help
Institutional Knowledge. Newsroom Continuity.
Co-Authors Plus
Multiple bylines.
Co-Authors Plus
“Guest” Authors.
Other Options?
- Peter’s Collaboration Plugins (Notes + Emails)
- Editorial Calendar
- Email Post Changes
- Post Forking
Your WordPress, Your Way
Tailor everything to your community and newsroom’s needs and culture; there is “no one size fits all” approach.
Protected: Presentation: 2013 In Review [VIP Workshop 2014]
Presentation: Deploys at WordPress.com VIP
This slideshow could not be started. Try refreshing the page or viewing it in another browser.
Deploys at WordPress.com VIP
About me: Mohammad (Mo) Jangda
mo@automattic.com | batmoo@gmail.com | @mjangda
- Code Wrangler at Automattic
- Ice Cream Fan
What is WordPress.com?
Hosted platform for running blogs, sites, etc. using WordPress.
Big multisite network.
What is VIP?
WordPress hosting and services for big companies (CNN, TIME, ESPN, CBS, TechCrunch, Williams, etc.)
A VIP site on WordPress.com is the same as a free site, except with some custom code a bit of magic sauce.
The VIP team works with external developers providing code review, developer support, etc.
Fancy Numbers
54 million sites
62 million users
30 million posts (per month)
13 billion pageviews / 400 uniques (per month)
500 million MySQL tables
2500 servers
3+ DCs
How Many Deploys?
Yesterday: 259
VIP: 165
WP.com: 75
Other: 19
How is code deployed on WordPress.com?
Production servers run trunk
– Commit changes to trunk
– Run deploy script
– Deploy script syncs svn mirrors across DCSs and runs `svn up` on all servers

$ deploy wpcom
Going to update from 93786 to 93787 for /public_html/
Syncing wpcom SVN Mirrors
DFW (1s)...
IAD (2s)...
SAT (2s)...
Deploying wpcom revision 93787
Deploying to static webs
SAT (1s)...
IAD (1s)...
DFW (1s)...
Deploying to dynamic webs
DFW (5s)...
IAD (7s)...
SAT (9s)...
What about VIPs?
Similar to WordPress.com except:
– Code comes from external developers
– Deploy done internally
– We only push the particular folder (code changes are limited to the “theme”)
VIP Numbers
5 Software Engineers; 1 Happiness Engineer; other biz people
7m lines of code (on top of WP.com codebase)
1000s of sites
~100 active developers
Over 140K commits (currently r140321)
70K deploys all time
Avg deploy time (commit => review => deploy): 130 minutes
Challenges
– External developers writing PHP, HTML, and JS so anything is fair game
– Issues on one site can spill over to another (also helps with scaling)
Code Review is Essential
Make sure they’re not doing not-so-good things
Guidelines: http://vip.wordpress.com/documentation/code-review-what-we-look-for/
Challenge: Code Review is hard and time-consuming! Blocks business needs!
Deploy Page
– custom built tool to optimize review process
– Used to track pending commits, review changes, and deploy
– Can send feedback on issues, alert rest of team when issues spotted
– Handy revert commands!
– “real-time”
Pre-Deploy Tests
Run when deploy button is pressed.
Loads up the site against a sandbox server in production with live database (crazy!) and latest code.
Static Analysis
Using custom scanning tools + PHP Code Sniffer to catch things like restricted functions, bad coding patterns/practices, etc.
Coming soon: post-commit tests
Using Jenkins to run tests immediately after commit, instead of on-demand using Sandbox server in production.
Other Tools
– Reference Page with handy revert commands
– IRC Channel piping PHP and MySQL errors from 2 servers
– IRC alerts for internal commit and deploy notifications
– Email and webhooks for external commit and deploy notifications
Future: Scaling
– More developers and automation
– Externally initiated deploys and post-deploy reviews
Hiring, Hiring, Hiring!
- VIP Wranglers, VIP Wranglers, VIP Wranglers!
- Code Wranglers, Code Wranglers, Code Wranglers!
- Designers, Designers, Designers!
- Happiness Engineers, Happiness Engineers, Happiness Engineers!
Presentation: Caching; for fun and profit
This slideshow could not be started. Try refreshing the page or viewing it in another browser.
Caching; For Fun & Profit
Understanding different caching tools and techniques available to WordPress developers such as the Transient and Object Caching APIs and how/why they can make or break your site.
About me: Mohammad (Mo) Jangda
mo@automattic.com | batmoo@gmail.com | @mjangda
- Toronto, ON
- Code Wrangler at WordPress.com VIP (Automattic)
- Core Contributor
- Ice Cream Fan
Hiring, Hiring, Hiring!
- VIP Wranglers, VIP Wranglers, VIP Wranglers!
- Code Wranglers, Code Wranglers, Code Wranglers!
- Designers, Designers, Designers!
- Happiness Engineers, Happiness Engineers, Happiness Engineers!
What is caching?
Caching is more than just installing a plugin to fix your uptime problems.
It’s a way to temporarily store data so that it can be reused.
What is caching?
It’s meant to avoid doing the same expensive computations (fetching from the database, making remote calls, etc.) over and over again.
Put something in a nearby place so can access it more readily.
Can cache all types of things: objects, arrays, strings, integers, etc.
Analogy: A Fireplace, A Lumberjack, and A Pile o’ Wood
So What?
According to Google:
High performance web sites lead to higher visitor engagement, retention and conversions
Translation:
Fast sites == $$$
What is a slow pageload?
A profit killer.
What is a slow pageload?
Inevitable (as your traffic and site grows).
What is a slow pageload?
An insult to your users. Your users appreciate/want/need/deserve a fast site.
Goal: This, or better
The Super Secret Technique To A Really Fast Site
The Fallback: Caching
Caching: More than just for speed
Caching will help prevent your site from going down if you rely on external services. If Twitter goes down, your site can too.
Caching: More than just for speed
Will force you to think about and write better code. And become a better developer.
The Cache Loop
Most caching interactions follow a simple loop-based pattern:
- Get the value we want from cache!
- Did we get it?
- If “no”: get or generate the value and cache it!
- Use the value!
Other patterns exist, but is the simplest, most common one.
The Cache Loop
value = get from cache if ( value not found ) { generate value save value in cache } do stuff with value
Different types of caching
- Variable/static caching
- Object caching
- Fragment caching (pieces of rendered HTML or output for a page)
- Opcode caching (PHP Acceleration)
- Full-page caching (the whole rendered page)
- Asset Caching (CDN)
Full-page caching
Your first and easiest line of defence. Store the entire generated page in cache and serve to users when they visit.
* Super Cache
* W3 Total Cache
* Batcache (used on WP.com; pages served in 0.004 seconds)
Harder now that we have more personalized, user-centric sites.
The quality of your code will impact how effective a full-page cache is
Code Quality is important
Caching/optimizing at the application-level is super important.
Will touch on this later.
Opcode Caching
APC, XCache, Zend Optimizer+, etc.
Improves the actual PHP-level load times of your application/site by storing compiled versions of your PHP files.
Can significantly improve load times if your site has thousands of files (or using large plugins like BuddyPress).
Variable Assignments
Is this better?
if ( get_the_terms() ) { foreach ( get_the_terms() as $term ) { … } }
Or this?
$terms = get_the_terms(); if ( $terms ) { foreach ( $terms as $term ) { … } }
Variable Assignments
Variable assignments are a type of caching.
You store a value in memory so it can be re-used.
Caching with the static
var
Useful if you repeat the same function over and over again but don’t want the value to persist between pageloads.
function x_is_it_true() { static $is_it_true; if ( ! isset( $is_it_true ) ) $is_it_true = call_really_expensive_function(); return $is_it_true; }
Little did you know…
WordPress has caching built-in!
WordPress has caching built-in!
A built-in, non-persistent caching API.
On any given pageload, you’re going to to need to fetch a single option potentially tens of times. And WordPress tries to optimize for that.
Note: it is non-persistant!*
Here’s how WordPress caches options:
-
Fetch all
autoload = yes
options:SELECT option_name, option_value FROM wptrunk_options WHERE autoload = 'yes'
- Add the results to object cache (which is really just a global array)
- Next time an option is needed, look in the cache first
- If not found, grab from the database and update the array.
Code Snippet from get_option()
$alloptions = wp_load_alloptions(); // wp_load_alloptions fetches autoload = yes if ( isset( $alloptions[$option] ) ) { $value = $alloptions[$option]; } else { ... $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); ... }
WordPress caches lots of things for you!
* options
* posts
* users
* queries
* terms
* etc.
Object Caching API
This is the API WordPress uses and makes available to developers:
/** * Retrieves the cache contents from the cache by key and group. * * @param int|string $key What the contents in the cache are called * @param string $group Where the cache contents are grouped * * @return bool|mixed False on failure to retrieve contents or the cache * contents on success */ function wp_cache_get( $key, $group = '' ) {
Object Caching API
/** * Saves the data to the cache. * * @param int|string $key What to call the contents in the cache * @param mixed $data The contents to store in the cache * @param string $group Where to group the cache contents * @param int $expire When to expire the cache contents * * @return bool False on failure, true on success */ function wp_cache_set( $key, $data, $group = '', $expire = 0 ) {
Object Caching API
/** * Adds data to the cache, if the cache key doesn't already exist. * * @param int|string $key The cache key to use for retrieval later * @param mixed $data The data to add to the cache store * @param string $group The group to add the cache to * @param int $expire When the cache data should be expired * * @return bool False if cache key and group already exist, true on success */ function wp_cache_add( $key, $data, $group = '', $expire = 0 ) {
Object Caching API
/** * Removes the cache contents matching key and group. * * @param int|string $key What the contents in the cache are called * @param string $group Where the cache contents are grouped * @return bool True on successful removal, false on failure */ function wp_cache_delete( $key, $group = '' ) {
Difference between wp_cache_add
and wp_cache_set
?
If the value already exists, add
will bail; set
will override.
A few other intricacies as well, although, don’t worry about them unless you’re building really big sites.
The Cache Loop: In Action!
// First, check to see if the value is in the cache $featured_posts = wp_cache_get( 'my-featured-posts' ); // Did we find it? if ( false === $featured_posts ) { // Nope! Let's generate and cache it! $featured_posts = get_posts( array( 'post__in' => get_option( 'sticky_posts' ) ) ); wp_cache_set( 'my-featured-posts', $featured_posts ); } // Cool, now we have our value; let's use it! foreach ( $featured_posts as $post ) { ...
Warning: Careful with the false
and error conditions!
You should account for those or be prepared for pain during failures.
$tweets = my_get_twitter_tweets( '#yolo' ); if ( $tweets ) { wp_cache_set( 'yolo', $tweets, 'my-tweets' ); }
Better Handling Error Conditions
$tweets = my_get_twitter_tweets( '#yolo' ); if ( $tweets ) { wp_cache_set( 'yolo', $tweets, 'my-tweets', MINUTE_IN_SECONDS * 10 ); } else { wp_cache_set( 'yolo', array(), 'my-tweets', MINUTE_IN_SECONDS * 1 ); }
Warning: Prefixing rules still apply
If you run into conflicts, you’re gonna have a bad time!
Warning: By default, caching in WordPress in non-persistent.
This means that your cache is emptied and re-built every time a new page is loaded.
Persistent Object Caching
You can make the data persist using an object caching backend like memcached:
http://wordpress.org/plugins/memcached/
This will retain objects in cache across pageloads, so you don’t need to hit the database again.
There are other caching backends as well like APC.
If you don’t have access to object cache…
Transients
If you’re a plugin/theme author, there’s no guarantee of the environment your users are in and whether persistent object caching is available.
WordPress Transients API helps you cache things without needed a caching backend.
Transients
The data:
a) persists across pageloads; and
b) expires after a set period of time (hence the name).
Useful for things like remote data or data that you know has a limited time span.
The Transients API
function get_transient( $transient ) {} function set_transient( $transient, $value, $expiration ) {} function delete_transient( $transient ) {}
The Cache Loop: In Action!
// First, check to see if the value is in the cache $remote_data = get_transient( 'my-remote-data' ); // Did we find it? if ( false === $remote_data ) { // Nope! Let's fetch and cache it! $response = wp_remote_get( 'http://foo.com/file.txt' ); $remote_data = json_decode( wp_remote_retrieve_body( $response ) ); set_transient( 'my-remote-data', $remote_data ); } // Cool, now we have our value; let's use it! foreach ( (array) $remote_data as $tweet ) { ...
Warning: Don’t overuse transients
* they’re stored in the options table and can bloat; and
* they require database calls to fetch.
Famous Last Words
“Oh, don’t worry. I’ll just put it in cache/transient…”
I worry. A lot.
Caching helps but…
You need to be smart about and understand what your application is doing.
A slow query will always be slow regardless of how many layers of caching you add around it.
Cache Stampedes Will Break You
Cache stampede: when a load of requests in succession kick of the same expensive process because all of them hit an empty cache on or around the same time.
Too many lumberjacks chopping the same wood
Cache Stampede: Solutions
- Locking: Prevent the pileup
- Async: Separate the cache generation process
…OR FIX (REMOVE) THE DAMN THING!
The Uncached (“cold cache”) Pageload
Optimize for the worst case scenario: aim for the best by optimizing for the worst (although, within realistic means).
Uncached pageloads should be as slim as possible.
The Uncached (“cold cache”) Pageload
Technique: Kill your object cache and examine load time patterns on a few different types of pages:
- homepage
- category
- single
- 404
- any special or complex templates
Examine the Uncached Pageload
What’s the load time like?
- If it times out, that’s a red flag.
- If the pageload time is inconsistent, that’s a red flag.
- If the pageload time is unusually high, that’s a red flag.
Summary
- Caching in WordPress is “easy”: many things built-in; many ways to do it
- Understanding the intricacies of who, what, when, where to cache is hard!
- There’s a lot more to caching than I’ve covered here!
- If used well, caching will help keep your site alive, fast, and $$$!
Protected: Presentation: Make It Faster II
Presentation: How to think and work like a VIP Developer
This slideshow could not be started. Try refreshing the page or viewing it in another browser.
How to think and work like a VIP Developer
About me: Mohammad (Mo) Jangda
mo@automattic.com | batmoo@gmail.com | @mjangda
- Toronto, ON
- Code Wrangler at WordPress.com VIP (Automattic)
- Core Contributor to WordPress
- Ice Cream Fan
Warning: #humblebrag
Please also excuse my terrible attempts at humour.
How Does VIP Work?
Automattic: Hosting & Support; Code Architecture and Review; Troubleshooting; Best Practices; Upgrades; etc.
Client or Partner: Editorial & Content; Development; Maintenance; etc.
There are a few simple formulas when it comes to scalability…
Big site + Lots of traffic
=
:(
Big site + Lots of traffic
+ Good infrastructure
=
:)
Big site + Lots of traffic
+ Good infrastructure
+ VIP Developer(s)
=
:D :D :D :D :D
Why does this Formula work?
Because VIP Developers are some of the best WordPress developers in the world!
Who are these mythical VIP Developers?
In a very literal sense: any developer who works on a VIP site.
VIP Developers work at various agencies
…or they work for the VIP sites
What’s so special about them?
- Their code scales! (Millions of pageviews? Bring it on!)
- Their code is secure (Hackers feel inadequate!)
- Their code is future-proof! (Always
trunk
-ready!) - Their code is clean, readable, extensible, modularized, well-documented, etc.
- Their code will make you a sandwich, if you ask nicely enough.
Most Importantly They’re Ruggedly Handsome!
The Key Question:
How does one become a VIP Developer?
(In the figurative sense)
Here’s the secret:
A VIP Developer is great at software development.
Qualities of a Great Software Developer
- Good Technical Aptitude
- Humble
- Open to feedback and improving on past mistakes
- Never stops learning
- Can break down, understand, and articulate problems
- Follows best practices and guidelines (and know when to break them)
- Can admit when they’re doing something wrong
Notice how I haven’t mentioned WordPress anywhere in the list?
Great Software Developers:
Understand and Follow good software development practices
- You don’t need to be a computer scientist
- Software design processes (e.g. Agile), patterns (e.g. Factories), principles (e.g. DRY)
- Think beyond the requirements
Notice how I still haven’t mentioned WordPress anywhere in the list?
Great Software Developers:
Are platform independant
- Expose yourself to non-WordPress-y things
- WordPress can power the Mars lander if we really want it to but that doesn’t mean we should.
- Explore other languages (beyond PHP)
- Explore libraries and other frameworks (beyond jQuery)
- Why? You can flex that muscle if a project comes up with that one odd requirement
- Or you can bring the thinking of other frameworks into your WordPress development
A VIP Developer’s Rules to Live By
The Most Important One:
Don’t make Mo mad!
(He will take away your commit access!)
Rule: Become a WordPress expert
- You don’t need to know everything
- But you do need to know the key components and how they interact with each other
- Example: what pieces of WordPress interact during any given pageload
- Helps with troubleshooting, debugging, feature development
Rule: Become Intimate with Code
- Spend more time with code than is healthy (have the Trac and SVN URLs bookmarked)
- Know what code lives where (or how to find it)
- Use great resources (e.g. Adam Brown’s Hook and Filter Database)
Rule: Follow core development
…or, better, contribute!
Rule: Never, ever modify WordPress core
Rule: Debug Often
And know what tools to use
define( 'WP_DEBUG', true );
Developer Plugin (http://wordpress.org/extend/plugins/developer/)
Rule: Don’t copy-pasta code without reviewing and understand what it does
Rule: Do things the “WordPress way”
- Use WordPress’ built-in APIs wherever possible
- If you need to access the database, use $wpdb
- Fetching Remote data, use the HTTP API, e.g. wp_remote_get
- http://codex.wordpress.org/WordPress_API’s
Rule: Always write secure code, even if it takes longer
Security should be a part of the development process, not an after-thought.
You eventually get to a point where all the code you write is inherently written with security in mind.
Rule: Follow the WordPress Coding Standards
Rule: Prefix all the things!
To prevent the dreaded WSOD!
Rule: Use source control
- Doesn’t matter what system (git, svn, mercurial)
- Think in terms of changesets and small commits
- Benefits: Instant backup, experimentation, disk space (.bk files), teams
Rule: Get your code reviewed often
…and use it as an opportunity to grow!
Rule: Give back to the community
Because it feels good! And it’s good for you too!
Rule: Know when to break the rules
Caveat:
Developing this takes alot of time, effort, willpower, determination, etc.
Thanks!
WordPress in the Newsroom (NASH)
This slideshow could not be started. Try refreshing the page or viewing it in another browser.
WordPress in the Newsroom
About me: Mohammad (Mo) Jangda
mo@automattic.com | batmoo@gmail.com | @mjangda
- Code Wrangler at WordPress.com VIP (Automattic)
- Core Contributor to WordPress
- Imprint (University of Waterloo) Alum
- NASH 2007
- Background in News, Publishing, Tech
- Ice Cream Fan
DISCLAIMER #1
A lot of the plugins I will talk about are mine or have significant contributions by me. Not because I’m being self-serving asshat but because these are some of the best tools for newsrooms to use.
DISCLAIMER #2
Tailor everything to your community and newsroom’s needs and culture; there is “no one size fits all” approach.
Scientific Fact of the Day!
17.5% of the web uses WordPress
(New York Times, TIME, CNN, CBS Local, National Post, Quartz, Boing Boing, Mashable, etc.)


Unscientific Fact of the Day!
80% of Canadian University newspapers use WordPress to power their sites.
University of Toronto | thevarsity.ca
University of Waterloo | theimprint.ca
University of Western Ontario | westerngazette.ca
York University | excal.on.ca
University of Victoria | martlet.ca
Ryerson University | theeyeopener.com
Carleton University | charlatan.ca
Concordian University | theconcordian.com
University of British Columbia | ubyssey.ca
University of Ottawa | thefulcrum.ca
University of Manitoba | themanitoban.com
It’s hip to be WordPress
But do you really know and use WordPress?
Leveraging Structured Data
WordPress is a semantic publishing platform.
Custom Post Types
A custom post type is nothing more than a regular post with a different
MARKDOWN_HASH01b0357bbb461420eb0aced7e3c2fcb9MARKDOWN_HASH
value in the database. The post type of regular posts is post, pages use page, attachments use attachment and so on. You can now create your own to indicate the type of content created. You could create custom post types for books, movies, reviews, products and so on.
— Smashing Magazine (http://wp.smashingmagazine.com)
Custom Taxonomies
WordPress’ custom taxonomies make it possible to structure large amounts of content in a logical, well-organized way. In WordPress, categories are set up as a hierarchal taxonomy, and tags are set up as a multifaceted taxonomy […] A large news organization could organize its content by world region (Africa, Asia, Europe, Latin America, Middle East, US & Canada), as the BBC does in its “World” section.
— Smashing Magazine (http://wp.smashingmagazine.com)
Post Metadata
WordPress lets you add arbitrary metadata to posts. Movie Ratings. Pull quotes. Geolocation.
Leveraging Media
Easy Galleries. Easy Embeds.
HULK NOW A JOURNALIST FOR FREEDOM! HULK SMASH LIES!
— Journalist Hulk (@iiefhwpi23hdkwd) January 10, 2011
Leveraging Mobile
Make the mobile app a pre-requisite for all your editors and reporters.
Leveraging Real-time
Liveblogging. All the things.
Leveraging Social
- Social Commenting
- Social Sharing
- Social Publishing
Leveraging a Web-first Workflow
WordPress is your central hub and content store.
Plugin: Edit Flow
Edit Flow gives you custom statuses, a calendar, editorial comments, and more, all to make it much easier for your team to collaborate within WordPress.
Edit Flow: Calendar
A convenient month-by-month look at your content
Edit Flow: Custom Statuses
Define the key stages to your workflow.
Edit Flow: Editorial Comments
Threaded commenting in the admin for private discussion between writers and editors
Edit Flow: Everything Else
- Notifications – Receive timely updates on the content you’re following.
- User Groups – Keep your users organized by department or function.
- Editorial Metadata – Keep track of the important details.
- Story Budget – View all of your upcoming posts in a more traditional story budget view, and hit the print button to take it to your planning meeting.
Plugin: Zoninator (Zone Manager)
Curation Made Easy.
Plugin: Co-Authors Plus
Multiple bylines.
Plugin: Co-Authors Plus
“Guest” Authors.
Plugin: WP-Help
Institutional Knowledge. Newsroom Continuity.
Lots and lots more
- Peter’s Collaboration Plugins (Notes + Emails)
- Editorial Calendar
- Winer Links
- Email Post Changes
- Post Forking
- Post Forking
- Project Largo
Iterate. Test. F#$% S#$% Up.
Think like a startup. Try new things. Share what you know/learn/build. Change the world.
Thanks!
mo@automattic.com | batmoo@gmail.com | @mjangda
Is your college paper on WP? Tweet us at #nash75wp!
Want free upgrades on WordPress.com? Come talk to me.