Last active
April 10, 2018 02:38
-
-
Save gregrickaby/6915797 to your computer and use it in GitHub Desktop.
A "must use" plugin to help save theme-agnostic functions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Must-Use Functions | |
* | |
* A class filled with functions that will never go away upon theme deactivation. | |
* | |
* @package WordPress | |
* @subpackage GRD | |
*/ | |
class GRD_Functions { | |
public function __construct() { | |
add_action( 'after_setup_theme', array( $this, 'define_constants' ), 1 ); | |
add_action( 'init', array( $this, 'add_post_type' ) ); | |
add_action( 'init', array( $this, 'add_taxonomy' ) ); | |
add_action( 'wp_head', array( $this, 'print_header_scripts' ), 997 ); | |
add_action( 'wp_head', array( $this, 'enqueue_scripts' ), 998 ); | |
add_action( 'wp_footer', array( $this, 'print_footer_scripts' ), 999 ); | |
} | |
public function define_constants() { | |
// Path to the child theme directory | |
$this->maybe_override_contant( 'GRD_DIR', get_stylesheet_directory_uri() ); | |
$GRD_DIR = trailingslashit( GRD_DIR ); | |
// Path to the css directory | |
$this->maybe_override_contant( 'GRD_CSS', $GRD_DIR . 'css' ); | |
// Path to the images directory | |
$this->maybe_override_contant( 'GRD_IMG', $GRD_DIR . 'images' ); | |
// Path to the included files directory | |
$this->maybe_override_contant( 'GRD_INC', $GRD_DIR . 'inc' ); | |
// Path to the javascript directory | |
$this->maybe_override_contant( 'GRD_JS', $GRD_DIR . 'js' ); | |
// Path to the sass directory | |
$this->maybe_override_contant( 'GRD_SASS', $GRD_DIR . 'sass' ); | |
// Path to CDN | |
$this->maybe_override_contant( 'GRD_CDN', 'http://cdn.gregrickaby.com/' ); | |
$GRD_CDN = trailingslashit( GRD_CDN ); | |
// Path to CDN styles | |
$this->maybe_override_contant( 'GRD_CDN_CSS', $GRD_CDN . 'css' ); | |
// Path to CDN images | |
$this->maybe_override_contant( 'GRD_CDN_IMG', $GRD_CDN . 'images' ); | |
// Path to CDN scripts | |
$this->maybe_override_contant( 'GRD_CDN_JS', $GRD_CDN . 'js' ); | |
} | |
public function maybe_override_contant( $constant, $value ) { | |
if ( ! defined( $constant ) ) { | |
define( $constant, $value ); // Constants can be overidden via wp-config.php | |
} | |
} | |
public function enqueue_scripts() { | |
wp_enqueue_script( 'some-script', GRD_JS . '/some-script.js', null, null, true ); | |
} | |
public function add_post_type() { | |
$this->setup_post_type( array( 'Code', 'Code', 'code', 'code' ), array( 'menu_position' => '1' ) ); | |
$this->setup_post_type( array( 'Gif', 'Gifs', 'gifs', 'gifs' ), array( 'menu_position' => '2' ) ); | |
$this->setup_post_type( array( 'Photo', 'Photos', 'photos', 'photos' ), array( 'menu_position' => '3' ) ); | |
$this->setup_post_type( array( 'Recipe', 'Recipes', 'recipes', 'recipies' ), array( 'menu_position' => '4' ) ); | |
} | |
public function setup_post_type( $type, $args = array() ) { | |
if ( is_array( $type ) ) { | |
$types = isset( $type[1] ) ? $type[1] : $type . 's'; | |
$key = isset( $type[2] ) ? $type[2] : strtolower( str_ireplace( ' ', '_', $type[1] ) ); | |
$slug = isset( $type[3] ) ? $type[3] : str_ireplace( '_', '-', $key ); | |
$type = $type[1]; | |
} else { | |
$types = $type . 's'; | |
$key = strtolower( str_ireplace( ' ', '_', $type ) ); | |
$slug = str_ireplace( '_', '-', $key ); | |
} | |
$labels = array( | |
'name' => $type, | |
'singular_name' => $type, | |
'add_new' => 'Add New', | |
'add_new_item' => 'Add New ' . $type, | |
'edit_item' => 'Edit ' . $type, | |
'new_item' => 'New ' . $type, | |
'view_item' => 'View ' . $type, | |
'search_items' => 'Search ' . $types, | |
'not_found' => 'No ' . $types . ' found', | |
'not_found_in_trash' => 'No ' . $types . ' found in Trash', | |
'parent_item_colon' => '', | |
'menu_name' => $types | |
); | |
$rewrite = array( | |
'slug' => $slug, | |
'with_front' => true, | |
'pages' => true, | |
'feeds' => true, | |
); | |
$args = wp_parse_args( $args, array( | |
'labels' => $labels, | |
'public' => true, | |
'publicly_queryable' => true, | |
'show_ui' => true, | |
'query_var' => true, | |
'rewrite' => $rewrite, | |
'capability_type' => 'post', | |
'hierarchical' => false, | |
'menu_position' => '5', | |
'has_archive' => true, | |
'exclude_from_search' => false, | |
'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', 'genesis-cpt-archives-settings' ), | |
'taxonomies' => array() | |
)); | |
register_post_type( $key, $args ); | |
} | |
public function add_taxonomy() { | |
$this->setup_taxonomy( 'Tag', 'Code Tags', 'code', 'code-tags', array( 'code' ) ); | |
$this->setup_taxonomy( 'Tag', 'Gif Tags', 'gifs', 'gif-tags', array( 'gifs' ) ); | |
$this->setup_taxonomy( 'Tag', 'Photo Tags', 'photos', 'photos-tags', array( 'photos' ) ); | |
$this->setup_taxonomy( 'Tag', 'Recipe Tags', 'recipes', 'recipes-tags', array( 'recipes' ) ); | |
} | |
public function setup_taxonomy( $type, $types, $key, $url_slug, $post_type_keys ) { | |
$labels = array( | |
'name' => $types, | |
'singular_name' => $type, | |
'search_items' => 'Search ' . $types, | |
'popular_items' => 'Common ' . $types, | |
'all_items' => 'All ' . $types, | |
'parent_item' => null, | |
'parent_item_colon' => null, | |
'edit_item' => 'Edit ' . $type, | |
'update_item' => 'Update ' . $type, | |
'add_new_item' => 'Add New ' . $type, | |
'new_item_name' => 'New ' . $type . ' Name', | |
'separate_items_with_commas' => 'Separate ' . $types . ' with commas', | |
'add_or_remove_items' => 'Add or remove ' . $types, | |
'choose_from_most_used' => 'Choose from the most used ' . $types | |
); | |
$rewrite = array( | |
'slug' => $url_slug, | |
'with_front' => true, | |
'hierarchical' => true, | |
); | |
$args = array( | |
'labels' => $labels, | |
'hierarchical' => true, | |
'public' => true, | |
'show_ui' => true, | |
'show_admin_column' => true, | |
'show_in_nav_menus' => true, | |
'show_tagcloud' => true, | |
'query_var' => true, | |
'rewrite' => $rewrite | |
); | |
register_taxonomy( $key, $post_type_keys, $args ); | |
} | |
public function print_header_scripts() { ?> | |
<script> | |
var _gaq = _gaq || []; | |
_gaq.push(['_setAccount', 'UA-XXXXXXX-XX']); | |
_gaq.push(['_trackPageview']); | |
(function() { | |
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | |
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | |
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | |
})(); | |
</script> | |
<?php } | |
public function print_footer_scripts() { ?> | |
<script> | |
// some javascript or jquery here | |
</script> | |
<?php } | |
} | |
// Instantiate the class | |
$GRD_Functions = new GRD_Functions(); |
Gary Jones doesn't recommend the use of a Singleton: http://dsgnwrks.pro/development-principles/gary-jones-recommended-resources-on-avoiding-singletons/
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I forked it and made a few modifications (in the spirit of @GaryJones): https://gist.github.com/jtsternberg/6918144
Added a bit more/better documentation, a helper function creating the taxonomy/cpt names, wrapped your JS in the footer in a undefined check (in case the NProgress script isn't loaded), and made the whole class a singleton instance (http://wp.tutsplus.com/tutorials/creative-coding/design-patterns-in-wordpress-the-singleton-pattern/). I also changed your constants hook from a level one priority in case you ever wanted to use that hook to define one of your constants (instead of in wp-config).