wp-tools
A collection of helpers for use in WordPress development.
Installation
To setup in a new project:
cd wp-content/mu-plugins
git init
git submodule add git@github.com:jabes/wp-tools.git
To setup from a cloned project:
git submodule update --init
Typical directory structure:
|- themes/
|- plugins/
|- mu-plugins/
|- wp-tools/
|- src/
|- wp-tools.php
|- my-plugin/
|- src/
|- my-plugin.php
|- load.php
Where load.php might look like:
require_once 'wp-tools/wp-tools.php';
require_once 'my-plugin/my-plugin.php';
Fields
A layer on top of ACF to help programmatically create, update, and get custom field values.
Register Field Group
<?php
function register_fields()
{
$group = new FieldGroup('group_name', 'Group Name');
$group->field('text', 'heading', 'Heading');
$group->field('textarea', 'description', 'Description');
$group->field('repeater', 'items', 'Items')
->sub_field('post_object', 'item', 'Item', [ 'post_type' => 'item' ])
->sub_field('true_false', 'is_visible', 'Visibility', [
'default_value' => 1,
'message' => 'Should we temporarily hide this?',
'ui' => 1,
'ui_on_text' => 'Visible',
'ui_off_text' => 'Hidden',
]);
$group->location('post_type', 'page');
$group->options(['style' => 'seamless']);
$group->register();
}
add_action('init', 'register_fields');
Get Field Value
<?php $post = get_post(); Field::get($post->ID,'group_name', 'heading'); Field::get($post->ID,'group_name', 'description'); Field::get($post->ID,'group_name', 'items');
Update Field Value
<?php $post = get_post(); Field::update($post->ID, 'group_name', 'heading', 'This is a heading'); Field::update($post->ID, 'group_name', 'description', 'The quick brown fox jumps over the lazy dog.'); Field::update_sub_field($post->ID, 'group_name', 'items', 'item', 0, 'First Item Value'); Field::update_sub_field($post->ID, 'group_name', 'items', 'item', 0, 'Second Item Value'); Field::update_sub_field($post->ID, 'group_name', 'items', 'item', 0, 'Third Item Value');
Post Types
A layer on top of the WordPress register_post_type function to help simplify and normalize the process.
Register
<?php
function register_post_types()
{
PostType::register('my_post_type', array(
'single' => array(
'lower' => 'my post type',
'upper' => 'My Post Type',
),
'plural' => array(
'lower' => 'my post types',
'upper' => 'My Post Types',
),
), array(
'menu_icon' => 'dashicons-admin-site',
));
}
add_action('init', 'register_post_types');
Taxonomy
A layer on top of the WordPress register_taxonomy function to help simplify and normalize the process.
Register
<?php
function register_taxonomies()
{
Taxonomy::register('my_taxonomy', 'my_post_type', array(
'single' => array('upper' => 'My Taxonomy'),
'plural' => array('upper' => 'My Taxonomies'),
));
}
add_action('init', 'register_taxonomies');
Terms
While taxonomies must be constantly registered, taxonomy terms should only be inserted once or they duplicate.
<?php
function add_taxonomy_terms()
{
$key = 'taxonomy_terms_added';
$added = get_option($key);
if (!$added) {
Taxonomy::insert_terms('my_taxonomy', array(
'Term 1',
'Term 2',
'Term 3',
));
update_option($key, true);
}
}
add_action('admin_init', 'add_taxonomy_terms');
Query Usage
<?php
$tax_query = array();
$tax_query[] = array(
'taxonomy' => 'my_taxonomy',
'field' => 'slug',
'operator' => 'IN',
'terms' => array(
'term_1',
'term_2',
'term_3',
),
);
$args = array(
'post_type' => 'my_post_type',
'post_status' => 'publish',
'posts_per_page' => -1,
'tax_query' => $tax_query,
);
$query = WP_Query($args);
Customizer
A layer on top of the WordPress customize_register function to help simplify and normalize the process.
Example Usage:
<?php
function register_custom_options(WP_Customize_Manager $wp_customize)
{
Customizer::add_section($wp_customize, 'my_customizer_section', array(
'title' => "My Customizer Section",
));
Customizer::add_setting($wp_customize, 'my_customizer_setting');
Customizer::add_control($wp_customize, 'my_customizer_setting', array(
'label' => "My Customizer Setting",
'description' => "A description for this control.",
'section' => 'my_customizer_section',
'type' => 'text',
));
}
add_action('customize_register', 'register_custom_options');
Admin Notice
A helper class that shows admin notices on page refresh.
Example Usage:
<?php
function validate_post_data($data, $postarr)
{
$error = false;
$post_type = $data['post_type'];
if ($post_type != 'my_post_type') return $data;
if (empty($postarr['post_title'])) {
Notice::error('Please provide a post title.');
$error = true;
}
if ($error) {
// Draft the post when there has been an error
$data['post_status'] = 'draft';
// The post message will now be outdated so refresh it
add_filter('redirect_post_location', function ($location) {
return add_query_arg('message', 10, $location);
});
}
return $data;
}
add_action('wp_insert_post_data', 'validate_post_data', 99, 2);