WordPress and the single responsibility principle
<?php | |
namespace WPMemeShortcode; | |
/** | |
* The WordPress Meme Shortcode admin page. | |
* | |
* @author Carl Alexander | |
*/ | |
class AdminPage | |
{ | |
/** | |
* @var Options | |
*/ | |
private $options; | |
/** | |
* Register the admin page class with all the appropriate WordPress hooks. | |
* | |
* @param Options $options | |
*/ | |
public static function register(Options $options) | |
{ | |
$page = new self($options); | |
add_action('admin_init', array($page, 'configure')); | |
add_action('admin_menu', array($page, 'addAdminPage')); | |
} | |
/** | |
* Constructor. | |
* | |
* @param Options $options | |
*/ | |
public function __construct(Options $options) | |
{ | |
$this->options = $options; | |
} | |
/** | |
* Adds the admin page to the menu. | |
*/ | |
public function addAdminPage() | |
{ | |
add_options_page(__('WordPress Meme Shortcode', 'wp_meme_shortcode'), __('Meme Shortcode', 'wp_meme_shortcode'), 'install_plugins', 'wp_meme_shortcode', array($this, 'render')); | |
} | |
/** | |
* Configure the option page using the settings API. | |
*/ | |
public function configure() | |
{ | |
// Register settings | |
register_setting('wp_meme_shortcode', 'wp_meme_shortcode'); | |
// General Section | |
add_settings_section('wp_meme_shortcode_general', __('General', 'wp_meme_shortcode'), array($this, 'renderGeneralSection'), 'wp_meme_shortcode'); | |
add_settings_field('wp_meme_shortcode_size', __('Default Image Size', 'wp_meme_shortcode'), array($this, 'renderSizeField'), 'wp_meme_shortcode', 'wp_meme_shortcode_general'); | |
} | |
/** | |
* Renders the admin page using the Settings API. | |
*/ | |
public function render() | |
{ | |
?> | |
<div class="wrap" id="wp-meme-shortcode-admin"> | |
<h2><?php _e('WordPress Meme Shortcode', 'wp_meme_shortcode'); ?></h2> | |
<form action="options.php" method="POST"> | |
<?php settings_fields('wp_meme_shortcode'); ?> | |
<?php do_settings_sections('wp_meme_shortcode'); ?> | |
<?php submit_button(); ?> | |
</form> | |
</div> | |
<?php | |
} | |
/** | |
* Renders the general section. | |
*/ | |
public function renderGeneralSection() | |
{ | |
?> | |
<p><?php _e('Configure WordPress Meme Shortcode.', 'wp_meme_shortcode'); ?></p> | |
<?php | |
} | |
/** | |
* Renders the size field. | |
*/ | |
public function renderSizeField() | |
{ | |
?> | |
<input id="wp_meme_shortcode_size" name="wp_meme_shortcode[size]" type="number" value="<?php echo $this->options->get('size', '500'); ?>" /> | |
<?php | |
} | |
} |
<?php | |
/* | |
Plugin Name: WordPress Meme Shortcode | |
Description: Add some memes to your posts using a shortcode! | |
Author: Carl Alexander | |
Author URI: http://www.carlalexander.ca | |
License: GPL3 | |
*/ | |
// Load classes | |
require_once dirname(__FILE__) . '/AdminPage.php'; | |
require_once dirname(__FILE__) . '/Options.php'; | |
require_once dirname(__FILE__) . '/Plugin.php'; | |
require_once dirname(__FILE__) . '/Shortcode.php'; | |
\WPMemeShortcode\Plugin::load(); |
<?php | |
namespace WPMemeShortcode; | |
/** | |
* Manages WordPress Meme Shortcode options. | |
* | |
* @author Carl Alexander | |
*/ | |
class Options | |
{ | |
/** | |
* @var array | |
*/ | |
private $options; | |
/** | |
* Load the plugin options from WordPress. | |
* | |
* @return Options | |
*/ | |
public static function load() | |
{ | |
$options = get_option('wp_meme_shortcode', array()); | |
return new self($options); | |
} | |
/** | |
* Constructor. | |
* | |
* @param array $options | |
*/ | |
public function __construct(array $options = array()) | |
{ | |
$this->options = $options; | |
} | |
/** | |
* Gets the option for the given name. Returns the default value if the | |
* value does not exist. | |
* | |
* @param string $name | |
* @param mixed $default | |
* | |
* @return mixed | |
*/ | |
public function get($name, $default = null) | |
{ | |
if (!$this->has($name)) { | |
return $default; | |
} | |
return $this->options[$name]; | |
} | |
/** | |
* Checks if the option exists or not. | |
* | |
* @param string $name | |
* | |
* @return Boolean | |
*/ | |
public function has($name) | |
{ | |
return isset($this->options[$name]); | |
} | |
/** | |
* Sets an option. Overwrites the existing option if the name is already in use. | |
* | |
* @param string $name | |
* @param mixed $value | |
*/ | |
public function set($name, $value) | |
{ | |
$this->options[$name] = $value; | |
} | |
} |
<?php | |
namespace WPMemeShortcode; | |
/** | |
* WordPress Meme Shortcode Plugin. | |
* | |
* @author Carl Alexander | |
*/ | |
class Plugin | |
{ | |
/** | |
* Loads the plugin into WordPress. | |
*/ | |
public static function load() | |
{ | |
$options = Options::load(); | |
AdminPage::register($options); | |
Shortcode::register($options); | |
} | |
} |
<?php | |
namespace WPMemeShortcode; | |
/** | |
* WordPress Meme Shortcode handler. | |
* | |
* @author Carl Alexander | |
*/ | |
class Shortcode | |
{ | |
/** | |
* @var Options | |
*/ | |
private $options; | |
/** | |
* Register the shortcode class with all the appropriate WordPress hooks. | |
* | |
* @param Options $options | |
*/ | |
public static function register(Options $options) | |
{ | |
$shortcode = new self($options); | |
add_shortcode('meme', array($shortcode, 'handle')); | |
} | |
/** | |
* Constructor. | |
* | |
* @param Options $options | |
*/ | |
public function __construct(Options $options) | |
{ | |
$this->options = $options; | |
} | |
/** | |
* Handles the output of the shortcode. | |
* | |
* @param array $attributes | |
* @param string $content | |
*/ | |
public function handle(array $attributes, $content = null) | |
{ | |
// Do nothing if no ID is given or it is not numeric | |
if (!isset($attributes['id']) || !is_numeric($attributes['id'])) { | |
return $content; | |
} | |
// If no size is given or it is not a numeric value, get default. | |
if (!isset($attributes['size']) || !is_numeric($attributes['size'])) { | |
$attributes['size'] = $this->options->get('size', '500'); | |
} | |
return "<img src=\"http://cdn.memegenerator.net/instances/{$attributes['size']}x/{$attributes['id']}.jpg\" />"; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment