Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

WordPress for the 99%

305 views

Published on

Tame the wild web that's grown over decades of decentralized web services by providing a central self-service solution that's prettier, cheaper, and (as far as the customer is concerned) maintenance-free -- without hiring a small army. Texas A&M and Berkeley are maintaining WordPress networks of thousands of sites with web teams of two to five, and you can do it, too.

WordPress is popular because it's easy for users to grasp and easy for developers to extend. Why not take advantage of that to provide branded websites for your campus constituents? Sure, there are a few groups who need a custom site and have the money to pay for it--but what about everyone else? A little structured content here, some inline help there, and you have a one-size-fits-most solution for virtually every small website on your campus. Go beyond the student blog network! WordPress is for everybody: faculty, staff... even that events coordinator who needs a website by 5 because she's opening up registration in the morning and what do you mean, is the content written?

Using case studies from Texas A&M University and The University of California at Berkeley, I'll demonstrate how to set up common content models, templates, and workflows for:

* Departments
* Research teams
* Conferences & symposia
* Committees

Published in: Technology
  • Be the first to comment

  • Be the first to like this

WordPress for the 99%

  1. 1. W O R D P R E S S F O R T H E 9 9 % A O N E - S I Z E - F I T S - M O S T W P A A S C A S E S T U D Y Stephanie Leary stephanieleary.com @sleary
  2. 2. S T E P H A N I E L E A R Y . C O M @ S L E A R Y
  3. 3. W O R K E D W I T H …
  4. 4. T H E S E T W O …
  5. 5. S A M E P R O B L E M S , S A M E S O L U T I O N
  6. 6. W E G O T 9 9 P R O B L E M S • No acceptable central campus solution • No past oversight or control • No idea what has been built independently • Rogue servers • Itinerant workers
  7. 7. W E G O T 9 9 P R O B L E M S • Poor code • No updates • No branding • Insecure, unprofessional sites • Tiny staff • 100s of migration and new site requests
  8. 8. S O L U T I O N • One-size-fits-most WordPress template & plugin suite • Managed WordPress hosting • Backups • Security monitoring • Automatic critical updates • Support • Free to campus users*
  9. 9. B R A N D E D T H E M E S O L U T I O N • Flexible • 6 layout options • logo toggles • several color schemes • Responsive • Accessible
  10. 10. C O M M O N E L E M E N T S • WP Engine • Genesis child theme • Custom post types & taxonomies • Advanced Custom Fields plugin • Gravity Forms plugin • CAS Maestro plugin • GitHub Updater WP Pusher plugin
  11. 11. W H Y W P E N G I N E ? • Existing campus contract • Daily backups & one-button restore feature • Staging copies • Automatic security updates • Optimized for performance • Sucuri remediation of security incidents
  12. 12. W P E N G I N E C A V E A T S • Price jumps after 100 installs • Solution: Multisite • Bandwidth / visitor limitations (vs storage) • Restore points include entire multisite network • Solution: Migrate DB Pro plugin
  13. 13. W H Y G E N E S I S ? • Built-in… • Layout options • Color schemes • SEO features • plugins for slider, grid loops, multi-column text • featured content widgets • package of professional child themes
  14. 14. G E N E S I S C A V E A T S • No grandchild themes • Solution: JP Custom CSS plugin • Obscure to new developers • Solutions: • Visual Hook Guide • StudioPress snippet library • StudioPress theme documentation
  15. 15. P S E U D O - G R A N D C H I L D T H E M E S • Theme option: site-specific directory name • If filled in, and if it exists… • Enqueue style.css • Include functions.php
  16. 16. C A S M A E S T R O C A V E A T S • Minimal payload; no tailored onboarding • WP login back door not visible • No mobile app support • or any other app relying on XML-RPC • WP usernames must match CAS • Character limits are not the same*
  17. 17. S I T E S E T U P W I Z A R D I F Y O U A R E N O T U S I N G C A S , C O N S I D E R …
  18. 18. N E T W O R K - A C T I V A T E D P L U G I N S • Advanced Custom Fields • BE Subpages Widget • CAS Maestro • Display Posts Shortcode • Enable Media Replace • Genesis Grid • Gravity Forms • Image Widget • JP Custom CSS • JP Widget Visibility • Menu Social Icons • My Eyes Are Up Here • Related Posts By Taxonomy • Safe Redirect Manager • Seamless Sticky Custom Post Types • Simple Page Ordering • Term Management Tools • WCAG Fields for Gravity Forms • WP Post Type Archive Links • WP Editor Widget • WP Help • WP REST API • WP REST API Custom Fields • WP101
  19. 19. P L U G I N C A V E A T S • Is it maintained? • Can we maintain it? • Should we rewrite it? • Can we hook into it? • Licensing
  20. 20. J E T P A C K S U B S T I T U T E S • Users shouldn’t have to maintain wordpress.com accounts; Jetpack disconnects every few weeks • Developer mode doesn’t actually work very well • JP Widget Visibility • JP Carousel • JP Custom CSS
  21. 21. S P E C I A L T Y P L U G I N S • Download Monitor • Document Revisions • The Events Calendar Pro (Modern Tribe) • WP LaTeX • Visualizer
  22. 22. S E A R C H P L U G I N S • Relevanssi Premium • SearchWP • Google CSE
  23. 23. C U S T O M C O D E
  24. 24. F E A T U R E S • People directories (faculty, staff, student, combined) • Simple course catalog • Building / equipment directory • Publication lists • Research project profiles
  25. 25. E D I T I N G F E A T U R E S • Widget style chooser • Pull quotes • Editor toolbar changes • Rich text footer option • Centrally managed footer links
  26. 26. F R O N T E N D F E A T U R E S • Branding options • Color schemes • Custom widgets • Readability-style template for long documents
  27. 27. A D M I N F E A T U R E S • Dashboard widgets • Screen option defaults • Edit screen columns • Microtext changes • Posts page warning
  28. 28. N E T W O R K A D M I N F E A T U R E S • Logins go through main network site (CAS whitelist) • Default network role for subsite users • Main site login redirect for subsite users • Sortable Sites column for upload file usage
  29. 29. C O N T E N T M O D E L People Subject Areas Organizations People Type (Committees) (Groups) Courses Subject Areas Organizations Publications Subject Areas Research Subject Areas Facilities Subject Areas Facility Type
  30. 30. C U S T O M F I E L D S & E D I T S C R E E N S F O R A L L F I V E C U S T O M P O S T T Y P E S
  31. 31. A C F F I E L D S F O R P E O P L E
  32. 32. A C F F I E L D S F O R C O U R S E S
  33. 33. A C F F I E L D S F O R P U B L I C A T I O N S
  34. 34. A C F F I E L D S F O R F A C I L I T I E S
  35. 35. Requirements often describe structure: “separate” “search by…” “sort” “filter”
  36. 36. “We need a way to separate events bios products courses etc. from our posts and pages.” POST TYPE
  37. 37. “We want to display _____ alongside the description.” FIELD OR TAXONOMY
  38. 38. “We want to sort by X and Y as well as by title and date.” FIELD*
  39. 39. “This text input should be a controlled list.” TAXONOMY… PROBABLY
  40. 40. R E Q U I R E M E N T S
  41. 41. A C F F I E L D T Y P E S
  42. 42. C O N T E N T M O D E L I N G Q U E S T I O N S • What things are you writing about? How are they related? How are they grouped? • How detailed can we get and keep the editing process sustainable? • Should different groups of people have permission to edit different things?
  43. 43. C U S T O M F I E L D Q U E S T I O N S • What are the parts that make up each thing? • Which of those fit the fields the CMS provides, and which do we need to create? • What should the editing experience be for each part?
  44. 44. T A X O N O M Y Q U E S T I O N S • Do we have any groups in which several kinds of categories are mixed? Can these be separated into more clearly delineated groups? • Do our authors understand the differences between each group? • Should items in different groups have completely different sets of fields? (Maybe a post type is better.)
  45. 45. F I E L D O R T A X O N O M Y ? What is the format of this data? Should the input be a controlled list? Should duplicates be avoided? FIELDTAXONOMY NoYes Text Anything Else
  46. 46. A D V A N C E D C U S T O M F I E L D S G E N E R A T E W P O R C P T U I + R A P I D P R O T O T Y P E S
  47. 47. P O S T T Y P E S A N D T A X O N O M I E S
  48. 48. D E S I G N C O N T E N T I N C O N T E X T • Single page views • Date-based archives • Taxonomy-based archives • Site search results • Specialized search results • Home page features
  49. 49. I T E R A T E .
  50. 50. C O U R S E C O R R E C T I O N I S E A S Y • Post Type Switcher • Term Management Tools • WP All Export / WP All Import
  51. 51. P O S T T Y P E S W I T C H E R
  52. 52. T E R M M G M T T O O L S : M E R G E
  53. 53. T E R M M G M T T O O L S : C H A N G E
  54. 54. F I E L D T O T A X O N O M Y W P A L L E X P O R T
  55. 55. W P A R C H I V E S U S U A L L Y I N C L U D E … • Content or excerpts • All post types in taxonomy archives • All subcategories’ posts in parent archives
  56. 56. G E N E S I S G R I D L O O P S E T T I N G S
  57. 57. G E N E S I S G R I D L O O P S E T T I N G S
  58. 58. G E N E S I S T A B L E L O O P S function scl_loop_table_headers( $headers ) { $headerrow = ''; foreach ( $headers as $header ) { $headerrow .= sprintf( "<th>%s</th>n", $header ); } return sprintf( '<div class="loop"><table cellspacing="0" class="responsive"> <thead> <tr> %s </tr> </thead> <tbody>'."n", $headerrow ); }
  59. 59. G E N E S I S T A B L E L O O P S function scl_loop_table_cells( $data ) { $datarow = ''; $rowindex = 1; foreach ( $data as $title => $field ) { $class = ''; if ( empty( trim ( $field ) ) ) $class = ' class="empty"'; $tag = 'td'; if ( 1 == $rowindex ) $tag = 'th'; $datarow .= sprintf( '<%s title="%s" %s>%s</%1$s>'."n", $tag, $title, $class, $field ); $rowindex++; } return sprintf( "<tr id='post-%d' %s>n %s n </tr>n", get_the_ID(), genesis_attr( 'entry' ), $datarow ); }
  60. 60. G E N E S I S T A B L E L O O P S remove_action( 'genesis_loop', 'genesis_do_loop' ); add_action( 'genesis_loop', 'scl_course_table_loop', 10 ); function scl_course_table_loop() { if ( have_posts() ) : $headers = array( esc_html__('Course'), esc_html__('Number'), esc_html__('Instructor(s)'), esc_html__('Time') ); echo scl_loop_table_headers( $headers ); while ( have_posts() ) : the_post(); $data = array( sprintf( '<a href="%s" title="%s">%s</a>', esc_url( get_permalink() ), the_title_attribute( 'echo=0' ), get_the_title() ), get_field( 'course_number' ), get_field( 'instructors' ) ); echo scl_loop_table_cells( array_combine( $headers, $data ) ); endwhile; //* end of one post scl_loop_table_footer(); endif; //* end loop }
  61. 61. T A B L E L O O P C A V E A T S • No settings interface • Will override Grid Loop settings—user confusion?
  62. 62. L I S T C H I L D P A G E S
  63. 63. L I S T C H I L D P A G E S function scl_append_child_pages( $content = '' ) { $type = get_post_type(); if ( is_post_type_hierarchical( $type ) && empty( $content ) ) { $args = array( 'echo' => 0, 'depth' => 1, 'title_li' => '', 'child_of' => get_the_ID(), 'post_type' => $type ); $content .= '<ul class="childpages">' . wp_list_pages( $args ) . '</ul>'; } return $content; }
  64. 64. L I S T C H I L D P A G E S function scl_child_pages_shortcode() { return scl_append_child_pages(); } add_shortcode( 'child-pages', 'scl_child_pages_shortcode' ); add_shortcode( 'subpages', 'scl_child_pages_shortcode' ); add_filter( 'the_content', 'scl_append_child_pages' );
  65. 65. C P T A R C H I V E T E R M D I V I S I O N S • Archives settings option • Divide posts by selected taxonomy • Further subdivide by child terms? (depth)
  66. 66. D E E P T A X O N O M Y T E R M A R C H I V E S
  67. 67. S H A R E D T A X O N O M Y A R C H I V E S • Titles and breadcrumbs reflect only one term • Post types all mixed together • post_type not set
  68. 68. S H A R E D T A X O N O M Y T I T L E S https://gist.github.com/sillybean/ae00bea06ff1513d48ed1fd9cbaca3eb https://gist.github.com/sillybean/4f592e462ea51866082a099b11c6309d
  69. 69. S H A R E D T A X O N O M Y B R E A D C R U M B S
  70. 70. F I N D _ P O S T _ T Y P E ( ) function scl_find_post_type() { $type = get_query_var( 'post_type' ); if(( !isset( $type ) || empty( $type )) && is_tax()) { $current_term = get_queried_object(); $tax_obj = get_taxonomy( $current_term->taxonomy ); if ( count( $tax_obj->object_type ) == 1 ) $type = $tax_obj->object_type[0]; } return $type; }
  71. 71. R E P L A C E L O O P W I T H P O S T T Y P E L I S T
  72. 72. R E P L A C E L O O P W I T H P O S T T Y P E L I S T add_action( 'genesis_meta', 'scl_taxonomy_loop_switch' ); function scl_taxonomy_loop_switch() { if ( function_exists( 'scl_find_post_type' ) ) $type = scl_find_post_type(); else $type = get_query_var( 'post_type' ); if ( empty( $type ) || 'any' == $type || is_array( $type ) ) { remove_action( 'genesis_loop', 'genesis_do_loop' ); add_action( 'genesis_loop', 'scl_list_taxonomy_post_types', 1 ); } }
  73. 73. A D D P O S T T Y P E A R G U M E N T add_filter( 'term_link', 'tax_link_for_post_type', 10, 3 ); function tax_link_for_post_type($termlink, $term, $taxonomy){ $tax_obj = get_taxonomy( $taxonomy ); // if this is not a shared taxonomy, bail if ( count( $tax_obj->object_type ) == 1 ) return $termlink; $post_type = scl_find_post_type(); if ( !isset( $post_type ) || 'any' == $post_type ) return $termlink; return add_query_arg( 'post_type', $post_type, $termlink ); }
  74. 74. P E R - P O S T - T Y P E S I D E B A R S add_action( 'get_header', 'scl_cpt_switch_sidebar' ); function scl_cpt_switch_sidebar() { remove_action( 'genesis_sidebar', 'genesis_do_sidebar' ); add_action( 'genesis_sidebar', 'scl_do_sidebar' ); }
  75. 75. P E R - P O S T - T Y P E S I D E B A R S * function scl_do_sidebar() { if ( is_home() && !is_front_page() ) $type = 'post'; else $type = scl_find_post_type(); if ( is_active_sidebar( $type ) ) dynamic_sidebar( $type ); else genesis_do_sidebar(); }
  76. 76. W I D G E T V I S I B I L I T Y P L U G I N
  77. 77. R E Q U I R E D L I N K S
  78. 78. S Y N C E D F O O T E R L I N K S add_action( 'genesis_footer', 'scl_footer_required_links' ); function scl_footer_required_links() { if ( false === ( $links = get_transient( 'scl_footer_required_links' ) ) ) { $response = wp_remote_get( 'http://example.com/wp-json/wp/v2/pages/2' ); if ( wp_remote_retrieve_response_code( $response ) == 200 && ! is_wp_error( $response ) ) { $body = json_decode( wp_remote_retrieve_body( $response ), true ); $links = wp_kses_post( $body['content']['rendered'] ); } set_transient( 'scl_footer_required_links', $links, 12 * HOUR_IN_SECONDS ); } echo apply_filters( 'scl_footer_required_links', $links ); }
  79. 79. F O O T E R T E X T C U S T O M I Z E R F I E L D add_action( 'customize_register', 'scl_customizer_sections' ); function scl_customizer_sections( $wp_customize ) { $wp_customize->add_section( 'scl_footer', array( 'title' => 'Footer Text', 'priority' => 105, 'capability' => 'edit_pages', ) ); $wp_customize->add_setting( 'scl_footer_text', array( 'default' => '', 'sanitize_callback' => 'scl_sanitize_footer_text', 'transport' => 'postMessage', ) ); $wp_customize->add_control( 'scl_footer_text', array( 'label' => 'Footer text (copyright, etc.)', 'section' => 'scl_footer', 'type' => 'text', ) ); }
  80. 80. F O O T E R T E X T C U S T O M I Z E R F I E L D remove_action( 'genesis_footer', 'genesis_do_footer' ); add_action( 'genesis_footer', 'scl_custom_footer' ); function scl_custom_footer() { echo get_theme_mod( 'scl_footer_text', '&copy; ' . get_option( 'blogname' ) ); } function scl_sanitize_footer_text( $input ) { return wp_kses_post( force_balance_tags( $input ) ); }
  81. 81. F O O T E R R I C H T E X T O P T I O N remove_action( 'genesis_footer', 'genesis_do_footer' ); add_action( 'genesis_footer', 'scl_custom_footer' ); function scl_custom_footer() { echo '<div class="footer-content">'; echo do_shortcode( get_field( 'footer_text', 'option' ) ); echo '</div><!-- end .footer-content -->'; }
  82. 82. C M S U S E R SE N D U S E R S +
  83. 83. If content authors can’t or won’t use the CMS, it’s game over.
  84. 84. U S E R S I G N U P P R O C E S S • Site request form: • contact info • desired URL • Offsite delegation • Font licensing (&^#*@) • Copy template blog • Add user to blog
  85. 85. D E F A U L T N E T W O R K S I T E R O L E function tees_default_roles( $user_id ) { if ( is_main_site() && !is_user_member_of_blog( $user_id ) ) add_user_to_blog( get_current_blog_id(), $user_id, 'subscriber' ); } add_action( 'wpmu_activate_user', 'tees_default_roles', 10, 1 ); add_action( 'wpmu_new_user', 'tees_default_roles', 10, 1 ); add_action( 'user_register', ‘tees_default_roles', 10, 1 );
  86. 86. C A S U S E R N A M E R E S T R I C T I O N S
  87. 87. D A S H B O A R D W I D G E T S • My Sites • Way finder: CPTs and taxonomies • Way finder: Options page content • Link to support form
  88. 88. L O G I N R E D I R E C T S : N E T W O R K add_filter( 'login_redirect', 'tees_subsite_login_redirect', 100, 3 ); function tees_subsite_login_redirect( $redirect_to, $request_redirect_to, $user ) { if ( !is_user_member_of_blog( $user->ID ) ) { // this is the main network site. Stupid name. global $current_site; return get_site_url( $current_site, '', 'admin' ); } return $redirect_to; }
  89. 89. C H A N G E T H E A D M I N U I • Hide unneeded features • Make everything on the screen relevant • Change placeholders and labels • Add toolbar options for pattern library elements • Add inline help • Document in the CMS
  90. 90. H I D E U N N E E D E D F E A T U R E S
  91. 91. T U R N O F F S C R E E N O P T I O N S <?php add_filter( 'default_hidden_meta_boxes', 'my_default_hidden_screen_options', 10, 2 ); function my_default_hidden_screen_options( $hidden, $screen ) { $hide_these = array( 'dashboard_primary', 'postcustom', 'trackbacksdiv', ); return array_merge( $hidden, $hide_these ); }
  92. 92. T U R N O N S C R E E N O P T I O N S add_filter( 'default_hidden_meta_boxes', 'scl_toggle_meta_boxes', 10, 2 ); function scl_toggle_meta_boxes( $hidden, $screen ) { $hide_these = array( ... ); if ( $screen->base == 'nav-menus' ) { $show_these = array( 'add-post-type-course', 'add-post-type-people', 'add-post-type-publication', 'add-post-type-facility', 'add-post-type-research', 'add-people_type', 'add-organization', 'add-subject_area', 'add-facility_type', 'add-publication_type', ); $hidden = array_diff( $hidden, $show_these ); } return array_merge( $hidden, $hide_these ); }
  93. 93. M A K E E V E R Y T H I N G R E L E V A N T A D M I N C O L U M N S
  94. 94. M A K E E V E R Y T H I N G R E L E V A N T A D M I N C O L U M N S
  95. 95. M A K E E V E R Y T H I N G R E L E V A N T A D M I N C O L U M N S
  96. 96. C H A N G E P L A C E H O L D E R S
  97. 97. C H A N G E P L A C E H O L D E R S <?php add_filter( 'enter_title_here', 'my_title_placeholders' ); function my_title_placeholders( $placeholder ){ $screen = get_current_screen(); switch ( $screen->post_type ) { case 'people': $placeholder = 'Enter full name'; break; case 'course': $placeholder = 'Enter course title'; break; case 'facility': $placeholder = 'Enter building name and number'; break; default: break; } return $placeholder; }
  98. 98. C H A N G E P L A C E H O L D E R S
  99. 99. C H A N G E L A B E L S F E A T U R E D I M A G E S
  100. 100. C H A N G E L A B E L S F E A T U R E D I M A G E S
  101. 101. C H A N G E L A B E L S <?php remove_meta_box( 'postexcerpt', 'post', 'side' ); add_meta_box('postexcerpt', __( 'Plain Text Summary' ), 'post_excerpt_meta_box', 'post', 'normal', 'high');
  102. 102. N E W E X C E R P T L A B E L
  103. 103. A D D I N L I N E H E L P A D V A N C E D C U S T O M F I E L D S ( M E S S A G E F I E L D )
  104. 104. A D D I N L I N E H E L P A D V A N C E D C U S T O M F I E L D S ( M E S S A G E F I E L D )
  105. 105. C H A N G E I N L I N E H E L P
  106. 106. C H A N G E I N L I N E H E L P <?php remove_meta_box( 'postexcerpt', 'post', 'side' ); add_meta_box( 'postexcerpt', __( 'Plain Text Summary' ), 'custom_post_excerpt_meta_box', 'post', 'normal', ‘high’ ); function custom_post_excerpt_meta_box( $post ) { ?> <label class="screen-reader-text" for="excerpt"><?php _e( 'Plain Text Summary' ) ?></label> <textarea rows="1" cols="40" name="excerpt" id="excerpt"> <?php echo $post->post_excerpt; // textarea_escaped ?> </textarea> <p><?php __( 'The plain text summary will appear on archive pages (e.g. lists of posts by category) and in search results.' ); ?></p> <?php }
  107. 107. C H A N G E I N L I N E H E L P <?php remove_meta_box( 'postexcerpt', 'post', 'side' ); add_meta_box( 'postexcerpt', __( 'Plain Text Summary' ), 'custom_post_excerpt_meta_box', 'post', 'normal', ‘high’ ); function custom_post_excerpt_meta_box( $post ) { ?> <label class="screen-reader-text" for="excerpt"><?php _e( 'Plain Text Summary' ) ?></label> <textarea rows="1" cols="40" name="excerpt" id="excerpt"> <?php echo $post->post_excerpt; // textarea_escaped ?> </textarea> <p><?php __( 'The plain text summary will appear on archive pages (e.g. lists of posts by category) and in search results.' ); ?></p> <?php }
  108. 108. N E W E X C E R P T B O X
  109. 109. P O S T S P A G E M E S S A G E add_action( 'admin_notices', 'scl_postspage_print_notices' ); function scl_postspage_print_notices() { $screen = get_current_screen(); if ( $screen->parent_base != 'edit' || $screen->base != 'post' || $_REQUEST['action'] != 'edit' ) return; $posts_page = get_option( 'page_for_posts' ); if ( !$posts_page ) return; if ( $_REQUEST['post'] == $posts_page ) echo '<div class="error"><p>This page is a container for the most recent posts. It should always be empty, and you should never edit this page. To add a news item, go to <a href="post-new.php">Posts -- Add New</a>.<p></div>'; }
  110. 110. W P E D I T O R W I D G E T S T Y L E S
  111. 111. P A T T E R N L I B R A R Y I N T O O L B A R
  112. 112. A D D T O O L B A R S T Y L E S & B U T T O N S A D V A N C E D T I N Y M C E
  113. 113. A D D T O O L B A R S T Y L E S & B U T T O N S A D V A N C E D T I N Y M C E
  114. 114. A D D T O O L B A R S T Y L E S & B U T T O N S A D V A N C E D T I N Y M C E
  115. 115. A D D T O O L B A R S T Y L E S & B U T T O N S A D V A N C E D T I N Y M C E
  116. 116. R E M O V I N G T O O L B A R B U T T O N S function scl_mce_buttons( $buttons ) { $remove = array( 'underline', 'alignjustify' ); return array_diff( $buttons, $remove ); } add_filter( 'mce_buttons_2', 'scl_mce_buttons' );
  117. 117. A D D T O O L B A R S T Y L E S & B U T T O N S S H O R T C A K E U I
  118. 118. A D D T O O L B A R S T Y L E S & B U T T O N S S H O R T C A K E U I
  119. 119. A D D T O O L B A R S T Y L E S & B U T T O N S S H O R T C A K E U I
  120. 120. A D D T O O L B A R S T Y L E S & B U T T O N S S H O R T C A K E U I
  121. 121. B L O C K Q U O T E + C I T E B U T T O N
  122. 122. B L O C K Q U O T E + C I T E B U T T O N
  123. 123. B L O C K Q U O T E + C I T E B U T T O N
  124. 124. B L O C K Q U O T E + C I T E B U T T O N function scl_pullquote_mce_button() { if ( 'true' == get_user_option( 'rich_editing' ) ) { add_filter( 'mce_external_plugins', 'scl_pullquote_add_tinymce_plugin' ); add_filter( 'mce_buttons', 'scl_pullquote_register_mce_button' ); } } add_action('admin_head', 'scl_pullquote_mce_button'); function scl_pullquote_add_tinymce_plugin( $plugin_array ) { $plugin_array['blockquote_cite'] = get_stylesheet_directory_uri() .'/js/mce-buttons.js'; return $plugin_array; } function scl_pullquote_register_mce_button( $buttons ) { return array_push( $buttons, 'blockquote_cite' ); }
  125. 125. D O C U M E N T A T I O N
  126. 126. W P 1 0 1 V I D E O T U T O R I A L S I N T H E D A S H B O A R D
  127. 127. A D D H E L P L I B R A R Y I N T H E C M S W P H E L P
  128. 128. W P H E L P • Synchronized • Managed like pages • Set up sync source install or use main network site • Use relative links
  129. 129. T E C H N I C A L H O W - T O • Writing style guide • Links to brand guide, photo libraries, etc.
  130. 130. L I S T E N .
  131. 131. D O N O T A C C E P T T H E D E F A U L T .
  132. 132. “Well, that’s how the CMS does it.”
  133. 133. “Well, that’s how the CMS does it.”
  134. 134. “Well, that’s how we made the CMS do it.”
  135. 135. M O R E C O N T E N T S T R A T E G Y S T U F F • More code • A content inventory plugin • Videos • A book • http://stephanieleary.com/tag/content-strategy/
  136. 136. I M P O R T A N Y T H I N G T O W O R D P R E S S Y E T A N O T H E R P R E S E N T A T I O N

×