🏨 Hotel Booking Enhancements: - Implemented Eagle Booking Advanced Pricing add-on - Added Booking.com-style rate management system - Created professional calendar interface for pricing - Integrated deals and discounts functionality 💰 Advanced Pricing Features: - Dynamic pricing models (per room, per person, per adult) - Base rates, adult rates, and child rates management - Length of stay discounts and early bird deals - Mobile rates and secret deals implementation - Seasonal promotions and flash sales 📅 Availability Management: - Real-time availability tracking - Stop sell and restriction controls - Closed to arrival/departure functionality - Minimum/maximum stay requirements - Automatic sold-out management 💳 Payment Integration: - Maintained Redsys payment gateway integration - Seamless integration with existing Eagle Booking - No modifications to core Eagle Booking plugin 🛠️ Technical Implementation: - Custom database tables for advanced pricing - WordPress hooks and filters integration - AJAX-powered admin interface - Data migration from existing Eagle Booking - Professional calendar view for revenue management 📊 Admin Interface: - Booking.com-style management dashboard - Visual rate and availability calendar - Bulk operations for date ranges - Statistics and analytics dashboard - Modal dialogs for quick editing 🔧 Code Quality: - WordPress coding standards compliance - Secure database operations with prepared statements - Proper input validation and sanitization - Error handling and logging - Responsive admin interface 🤖 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
789 lines
29 KiB
PHP
789 lines
29 KiB
PHP
<?php
|
|
/**
|
|
* Include and setup custom metaboxes and fields. (make sure you copy this file to outside the CMB2 directory)
|
|
*
|
|
* Be sure to replace all instances of 'yourprefix_' with your project's prefix.
|
|
* http://nacin.com/2010/05/11/in-wordpress-prefix-everything/
|
|
*
|
|
* @category YourThemeOrPlugin
|
|
* @package Demo_CMB2
|
|
* @license http://www.opensource.org/licenses/gpl-license.php GPL v2.0 (or later)
|
|
* @link https://github.com/CMB2/CMB2
|
|
*/
|
|
|
|
/**
|
|
* Get the bootstrap! If using the plugin from wordpress.org, REMOVE THIS!
|
|
*/
|
|
|
|
if ( file_exists( dirname( __FILE__ ) . '/cmb2/init.php' ) ) {
|
|
require_once dirname( __FILE__ ) . '/cmb2/init.php';
|
|
} elseif ( file_exists( dirname( __FILE__ ) . '/CMB2/init.php' ) ) {
|
|
require_once dirname( __FILE__ ) . '/CMB2/init.php';
|
|
}
|
|
|
|
/**
|
|
* Conditionally displays a metabox when used as a callback in the 'show_on_cb' cmb2_box parameter
|
|
*
|
|
* @param CMB2 $cmb CMB2 object.
|
|
*
|
|
* @return bool True if metabox should show
|
|
*/
|
|
function yourprefix_show_if_front_page( $cmb ) {
|
|
// Don't show this metabox if it's not the front page template.
|
|
if ( get_option( 'page_on_front' ) !== $cmb->object_id ) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Conditionally displays a field when used as a callback in the 'show_on_cb' field parameter
|
|
*
|
|
* @param CMB2_Field $field Field object.
|
|
*
|
|
* @return bool True if metabox should show
|
|
*/
|
|
function yourprefix_hide_if_no_cats( $field ) {
|
|
// Don't show this field if not in the cats category.
|
|
if ( ! has_tag( 'cats', $field->object_id ) ) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Manually render a field.
|
|
*
|
|
* @param array $field_args Array of field arguments.
|
|
* @param CMB2_Field $field The field object.
|
|
*/
|
|
function yourprefix_render_row_cb( $field_args, $field ) {
|
|
$classes = $field->row_classes();
|
|
$id = $field->args( 'id' );
|
|
$label = $field->args( 'name' );
|
|
$name = $field->args( '_name' );
|
|
$value = $field->escaped_value();
|
|
$description = $field->args( 'description' );
|
|
?>
|
|
<div class="custom-field-row <?php echo esc_attr( $classes ); ?>">
|
|
<p><label for="<?php echo esc_attr( $id ); ?>"><?php echo esc_html( $label ); ?></label></p>
|
|
<p><input id="<?php echo esc_attr( $id ); ?>" type="text" name="<?php echo esc_attr( $name ); ?>" value="<?php echo $value; ?>"/></p>
|
|
<p class="description"><?php echo esc_html( $description ); ?></p>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Manually render a field column display.
|
|
*
|
|
* @param array $field_args Array of field arguments.
|
|
* @param CMB2_Field $field The field object.
|
|
*/
|
|
function yourprefix_display_text_small_column( $field_args, $field ) {
|
|
?>
|
|
<div class="custom-column-display <?php echo esc_attr( $field->row_classes() ); ?>">
|
|
<p><?php echo $field->escaped_value(); ?></p>
|
|
<p class="description"><?php echo esc_html( $field->args( 'description' ) ); ?></p>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Conditionally displays a message if the $post_id is 2
|
|
*
|
|
* @param array $field_args Array of field parameters.
|
|
* @param CMB2_Field $field Field object.
|
|
*/
|
|
function yourprefix_before_row_if_2( $field_args, $field ) {
|
|
if ( 2 == $field->object_id ) {
|
|
echo '<p>Testing <b>"before_row"</b> parameter (on $post_id 2)</p>';
|
|
} else {
|
|
echo '<p>Testing <b>"before_row"</b> parameter (<b>NOT</b> on $post_id 2)</p>';
|
|
}
|
|
}
|
|
|
|
add_action( 'cmb2_admin_init', 'yourprefix_register_demo_metabox' );
|
|
/**
|
|
* Hook in and add a demo metabox. Can only happen on the 'cmb2_admin_init' or 'cmb2_init' hook.
|
|
*/
|
|
function yourprefix_register_demo_metabox() {
|
|
$prefix = 'yourprefix_demo_';
|
|
|
|
/**
|
|
* Sample metabox to demonstrate each field type included
|
|
*/
|
|
$cmb_demo = new_cmb2_box( array(
|
|
'id' => $prefix . 'metabox',
|
|
'title' => esc_html__( 'Test Metabox', 'cmb2' ),
|
|
'object_types' => array( 'page' ), // Post type
|
|
// 'show_on_cb' => 'yourprefix_show_if_front_page', // function should return a bool value
|
|
// 'context' => 'normal',
|
|
// 'priority' => 'high',
|
|
// 'show_names' => true, // Show field names on the left
|
|
// 'cmb_styles' => false, // false to disable the CMB stylesheet
|
|
// 'closed' => true, // true to keep the metabox closed by default
|
|
// 'classes' => 'extra-class', // Extra cmb2-wrap classes
|
|
// 'classes_cb' => 'yourprefix_add_some_classes', // Add classes through a callback.
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Text', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'text',
|
|
'type' => 'text',
|
|
'show_on_cb' => 'yourprefix_hide_if_no_cats', // function should return a bool value
|
|
// 'sanitization_cb' => 'my_custom_sanitization', // custom sanitization callback parameter
|
|
// 'escape_cb' => 'my_custom_escaping', // custom escaping callback parameter
|
|
// 'on_front' => false, // Optionally designate a field to wp-admin only
|
|
// 'repeatable' => true,
|
|
// 'column' => true, // Display field value in the admin post-listing columns
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Text Small', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'textsmall',
|
|
'type' => 'text_small',
|
|
// 'repeatable' => true,
|
|
// 'column' => array(
|
|
// 'name' => esc_html__( 'Column Title', 'cmb2' ), // Set the admin column title
|
|
// 'position' => 2, // Set as the second column.
|
|
// );
|
|
// 'display_cb' => 'yourprefix_display_text_small_column', // Output the display of the column values through a callback.
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Text Medium', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'textmedium',
|
|
'type' => 'text_medium',
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Read-only Disabled Field', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'readonly',
|
|
'type' => 'text_medium',
|
|
'default' => esc_attr__( 'Hey there, I\'m a read-only field', 'cmb2' ),
|
|
'save_field' => false, // Disables the saving of this field.
|
|
'attributes' => array(
|
|
'disabled' => 'disabled',
|
|
'readonly' => 'readonly',
|
|
),
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Custom Rendered Field', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'render_row_cb',
|
|
'type' => 'text',
|
|
'render_row_cb' => 'yourprefix_render_row_cb',
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Website URL', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'url',
|
|
'type' => 'text_url',
|
|
// 'protocols' => array('http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet'), // Array of allowed protocols
|
|
// 'repeatable' => true,
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Text Email', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'email',
|
|
'type' => 'text_email',
|
|
// 'repeatable' => true,
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Time', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'time',
|
|
'type' => 'text_time',
|
|
// 'time_format' => 'H:i', // Set to 24hr format
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Time zone', 'cmb2' ),
|
|
'desc' => esc_html__( 'Time zone', 'cmb2' ),
|
|
'id' => $prefix . 'timezone',
|
|
'type' => 'select_timezone',
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Date Picker', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'textdate',
|
|
'type' => 'text_date',
|
|
// 'date_format' => 'Y-m-d',
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Date Picker (UNIX timestamp)', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'textdate_timestamp',
|
|
'type' => 'text_date_timestamp',
|
|
// 'timezone_meta_key' => $prefix . 'timezone', // Optionally make this field honor the timezone selected in the select_timezone specified above
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Date/Time Picker Combo (UNIX timestamp)', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'datetime_timestamp',
|
|
'type' => 'text_datetime_timestamp',
|
|
) );
|
|
|
|
// This text_datetime_timestamp_timezone field type
|
|
// is only compatible with PHP versions 5.3 or above.
|
|
// Feel free to uncomment and use if your server meets the requirement
|
|
// $cmb_demo->add_field( array(
|
|
// 'name' => esc_html__( 'Test Date/Time Picker/Time zone Combo (serialized DateTime object)', 'cmb2' ),
|
|
// 'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
// 'id' => $prefix . 'datetime_timestamp_timezone',
|
|
// 'type' => 'text_datetime_timestamp_timezone',
|
|
// ) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Money', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'textmoney',
|
|
'type' => 'text_money',
|
|
// 'before_field' => '£', // override '$' symbol if needed
|
|
// 'repeatable' => true,
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Color Picker', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'colorpicker',
|
|
'type' => 'colorpicker',
|
|
'default' => '#ffffff',
|
|
// 'options' => array(
|
|
// 'alpha' => true, // Make this a rgba color picker.
|
|
// ),
|
|
// 'attributes' => array(
|
|
// 'data-colorpicker' => json_encode( array(
|
|
// 'palettes' => array( '#3dd0cc', '#ff834c', '#4fa2c0', '#0bc991', ),
|
|
// ) ),
|
|
// ),
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Text Area', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'textarea',
|
|
'type' => 'textarea',
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Text Area Small', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'textareasmall',
|
|
'type' => 'textarea_small',
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Text Area for Code', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'textarea_code',
|
|
'type' => 'textarea_code',
|
|
// 'attributes' => array(
|
|
// // Optionally override the code editor defaults.
|
|
// 'data-codeeditor' => json_encode( array(
|
|
// 'codemirror' => array(
|
|
// 'lineNumbers' => false,
|
|
// 'mode' => 'css',
|
|
// ),
|
|
// ) ),
|
|
// ),
|
|
// To keep the previous formatting, you can disable codemirror.
|
|
// 'options' => array( 'disable_codemirror' => true ),
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Title Weeeee', 'cmb2' ),
|
|
'desc' => esc_html__( 'This is a title description', 'cmb2' ),
|
|
'id' => $prefix . 'title',
|
|
'type' => 'title',
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Select', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'select',
|
|
'type' => 'select',
|
|
'show_option_none' => true,
|
|
'options' => array(
|
|
'standard' => esc_html__( 'Option One', 'cmb2' ),
|
|
'custom' => esc_html__( 'Option Two', 'cmb2' ),
|
|
'none' => esc_html__( 'Option Three', 'cmb2' ),
|
|
),
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Radio inline', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'radio_inline',
|
|
'type' => 'radio_inline',
|
|
'show_option_none' => 'No Selection',
|
|
'options' => array(
|
|
'standard' => esc_html__( 'Option One', 'cmb2' ),
|
|
'custom' => esc_html__( 'Option Two', 'cmb2' ),
|
|
'none' => esc_html__( 'Option Three', 'cmb2' ),
|
|
),
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Radio', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'radio',
|
|
'type' => 'radio',
|
|
'options' => array(
|
|
'option1' => esc_html__( 'Option One', 'cmb2' ),
|
|
'option2' => esc_html__( 'Option Two', 'cmb2' ),
|
|
'option3' => esc_html__( 'Option Three', 'cmb2' ),
|
|
),
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Taxonomy Radio', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'text_taxonomy_radio',
|
|
'type' => 'taxonomy_radio', // Or `taxonomy_radio_inline`/`taxonomy_radio_hierarchical`
|
|
'taxonomy' => 'category', // Taxonomy Slug
|
|
// 'inline' => true, // Toggles display to inline
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Taxonomy Select', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'taxonomy_select',
|
|
'type' => 'taxonomy_select',
|
|
'taxonomy' => 'category', // Taxonomy Slug
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Taxonomy Multi Checkbox', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'multitaxonomy',
|
|
'type' => 'taxonomy_multicheck', // Or `taxonomy_multicheck_inline`/`taxonomy_multicheck_hierarchical`
|
|
'taxonomy' => 'post_tag', // Taxonomy Slug
|
|
// 'inline' => true, // Toggles display to inline
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Checkbox', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'checkbox',
|
|
'type' => 'checkbox',
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Multi Checkbox', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'multicheckbox',
|
|
'type' => 'multicheck',
|
|
// 'multiple' => true, // Store values in individual rows
|
|
'options' => array(
|
|
'check1' => esc_html__( 'Check One', 'cmb2' ),
|
|
'check2' => esc_html__( 'Check Two', 'cmb2' ),
|
|
'check3' => esc_html__( 'Check Three', 'cmb2' ),
|
|
),
|
|
// 'inline' => true, // Toggles display to inline
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test wysiwyg', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'wysiwyg',
|
|
'type' => 'wysiwyg',
|
|
'options' => array(
|
|
'textarea_rows' => 5,
|
|
),
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Test Image', 'cmb2' ),
|
|
'desc' => esc_html__( 'Upload an image or enter a URL.', 'cmb2' ),
|
|
'id' => $prefix . 'image',
|
|
'type' => 'file',
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'Multiple Files', 'cmb2' ),
|
|
'desc' => esc_html__( 'Upload or add multiple images/attachments.', 'cmb2' ),
|
|
'id' => $prefix . 'file_list',
|
|
'type' => 'file_list',
|
|
'preview_size' => array( 100, 100 ), // Default: array( 50, 50 )
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => esc_html__( 'oEmbed', 'cmb2' ),
|
|
'desc' => sprintf(
|
|
/* translators: %s: link to codex.wordpress.org/Embeds */
|
|
esc_html__( 'Enter a youtube, twitter, or instagram URL. Supports services listed at %s.', 'cmb2' ),
|
|
'<a href="https://codex.wordpress.org/Embeds">codex.wordpress.org/Embeds</a>'
|
|
),
|
|
'id' => $prefix . 'embed',
|
|
'type' => 'oembed',
|
|
) );
|
|
|
|
$cmb_demo->add_field( array(
|
|
'name' => 'Testing Field Parameters',
|
|
'id' => $prefix . 'parameters',
|
|
'type' => 'text',
|
|
'before_row' => 'yourprefix_before_row_if_2', // callback.
|
|
'before' => '<p>Testing <b>"before"</b> parameter</p>',
|
|
'before_field' => '<p>Testing <b>"before_field"</b> parameter</p>',
|
|
'after_field' => '<p>Testing <b>"after_field"</b> parameter</p>',
|
|
'after' => '<p>Testing <b>"after"</b> parameter</p>',
|
|
'after_row' => '<p>Testing <b>"after_row"</b> parameter</p>',
|
|
) );
|
|
|
|
}
|
|
|
|
add_action( 'cmb2_admin_init', 'yourprefix_register_about_page_metabox' );
|
|
/**
|
|
* Hook in and add a metabox that only appears on the 'About' page
|
|
*/
|
|
function yourprefix_register_about_page_metabox() {
|
|
$prefix = 'yourprefix_about_';
|
|
|
|
/**
|
|
* Metabox to be displayed on a single page ID
|
|
*/
|
|
$cmb_about_page = new_cmb2_box( array(
|
|
'id' => $prefix . 'metabox',
|
|
'title' => esc_html__( 'About Page Metabox', 'cmb2' ),
|
|
'object_types' => array( 'page' ), // Post type
|
|
'context' => 'normal',
|
|
'priority' => 'high',
|
|
'show_names' => true, // Show field names on the left
|
|
'show_on' => array(
|
|
'id' => array( 2 ),
|
|
), // Specific post IDs to display this metabox
|
|
) );
|
|
|
|
$cmb_about_page->add_field( array(
|
|
'name' => esc_html__( 'Test Text', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'text',
|
|
'type' => 'text',
|
|
) );
|
|
|
|
}
|
|
|
|
add_action( 'cmb2_admin_init', 'yourprefix_register_repeatable_group_field_metabox' );
|
|
/**
|
|
* Hook in and add a metabox to demonstrate repeatable grouped fields
|
|
*/
|
|
function yourprefix_register_repeatable_group_field_metabox() {
|
|
$prefix = 'yourprefix_group_';
|
|
|
|
/**
|
|
* Repeatable Field Groups
|
|
*/
|
|
$cmb_group = new_cmb2_box( array(
|
|
'id' => $prefix . 'metabox',
|
|
'title' => esc_html__( 'Repeating Field Group', 'cmb2' ),
|
|
'object_types' => array( 'page' ),
|
|
) );
|
|
|
|
// $group_field_id is the field id string, so in this case: $prefix . 'demo'
|
|
$group_field_id = $cmb_group->add_field( array(
|
|
'id' => $prefix . 'demo',
|
|
'type' => 'group',
|
|
'description' => esc_html__( 'Generates reusable form entries', 'cmb2' ),
|
|
'options' => array(
|
|
'group_title' => esc_html__( 'Entry {#}', 'cmb2' ), // {#} gets replaced by row number
|
|
'add_button' => esc_html__( 'Add Another Entry', 'cmb2' ),
|
|
'remove_button' => esc_html__( 'Remove Entry', 'cmb2' ),
|
|
'sortable' => true,
|
|
// 'closed' => true, // true to have the groups closed by default
|
|
),
|
|
) );
|
|
|
|
/**
|
|
* Group fields works the same, except ids only need
|
|
* to be unique to the group. Prefix is not needed.
|
|
*
|
|
* The parent field's id needs to be passed as the first argument.
|
|
*/
|
|
$cmb_group->add_group_field( $group_field_id, array(
|
|
'name' => esc_html__( 'Entry Title', 'cmb2' ),
|
|
'id' => 'title',
|
|
'type' => 'text',
|
|
// 'repeatable' => true, // Repeatable fields are supported w/in repeatable groups (for most types)
|
|
) );
|
|
|
|
$cmb_group->add_group_field( $group_field_id, array(
|
|
'name' => esc_html__( 'Description', 'cmb2' ),
|
|
'description' => esc_html__( 'Write a short description for this entry', 'cmb2' ),
|
|
'id' => 'description',
|
|
'type' => 'textarea_small',
|
|
) );
|
|
|
|
$cmb_group->add_group_field( $group_field_id, array(
|
|
'name' => esc_html__( 'Entry Image', 'cmb2' ),
|
|
'id' => 'image',
|
|
'type' => 'file',
|
|
) );
|
|
|
|
$cmb_group->add_group_field( $group_field_id, array(
|
|
'name' => esc_html__( 'Image Caption', 'cmb2' ),
|
|
'id' => 'image_caption',
|
|
'type' => 'text',
|
|
) );
|
|
|
|
}
|
|
|
|
add_action( 'cmb2_admin_init', 'yourprefix_register_user_profile_metabox' );
|
|
/**
|
|
* Hook in and add a metabox to add fields to the user profile pages
|
|
*/
|
|
function yourprefix_register_user_profile_metabox() {
|
|
$prefix = 'yourprefix_user_';
|
|
|
|
/**
|
|
* Metabox for the user profile screen
|
|
*/
|
|
$cmb_user = new_cmb2_box( array(
|
|
'id' => $prefix . 'edit',
|
|
'title' => esc_html__( 'User Profile Metabox', 'cmb2' ), // Doesn't output for user boxes
|
|
'object_types' => array( 'user' ), // Tells CMB2 to use user_meta vs post_meta
|
|
'show_names' => true,
|
|
'new_user_section' => 'add-new-user', // where form will show on new user page. 'add-existing-user' is only other valid option.
|
|
) );
|
|
|
|
$cmb_user->add_field( array(
|
|
'name' => esc_html__( 'Extra Info', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'extra_info',
|
|
'type' => 'title',
|
|
'on_front' => false,
|
|
) );
|
|
|
|
$cmb_user->add_field( array(
|
|
'name' => esc_html__( 'Avatar', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'avatar',
|
|
'type' => 'file',
|
|
) );
|
|
|
|
$cmb_user->add_field( array(
|
|
'name' => esc_html__( 'Facebook URL', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'facebookurl',
|
|
'type' => 'text_url',
|
|
) );
|
|
|
|
$cmb_user->add_field( array(
|
|
'name' => esc_html__( 'Twitter URL', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'twitterurl',
|
|
'type' => 'text_url',
|
|
) );
|
|
|
|
$cmb_user->add_field( array(
|
|
'name' => esc_html__( 'Google+ URL', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'googleplusurl',
|
|
'type' => 'text_url',
|
|
) );
|
|
|
|
$cmb_user->add_field( array(
|
|
'name' => esc_html__( 'Linkedin URL', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'linkedinurl',
|
|
'type' => 'text_url',
|
|
) );
|
|
|
|
$cmb_user->add_field( array(
|
|
'name' => esc_html__( 'User Field', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'user_text_field',
|
|
'type' => 'text',
|
|
) );
|
|
|
|
}
|
|
|
|
add_action( 'cmb2_admin_init', 'yourprefix_register_taxonomy_metabox' );
|
|
/**
|
|
* Hook in and add a metabox to add fields to taxonomy terms
|
|
*/
|
|
function yourprefix_register_taxonomy_metabox() {
|
|
$prefix = 'yourprefix_term_';
|
|
|
|
/**
|
|
* Metabox to add fields to categories and tags
|
|
*/
|
|
$cmb_term = new_cmb2_box( array(
|
|
'id' => $prefix . 'edit',
|
|
'title' => esc_html__( 'Category Metabox', 'cmb2' ), // Doesn't output for term boxes
|
|
'object_types' => array( 'term' ), // Tells CMB2 to use term_meta vs post_meta
|
|
'taxonomies' => array( 'category', 'post_tag' ), // Tells CMB2 which taxonomies should have these fields
|
|
// 'new_term_section' => true, // Will display in the "Add New Category" section
|
|
) );
|
|
|
|
$cmb_term->add_field( array(
|
|
'name' => esc_html__( 'Extra Info', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'extra_info',
|
|
'type' => 'title',
|
|
'on_front' => false,
|
|
) );
|
|
|
|
$cmb_term->add_field( array(
|
|
'name' => esc_html__( 'Term Image', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'avatar',
|
|
'type' => 'file',
|
|
) );
|
|
|
|
$cmb_term->add_field( array(
|
|
'name' => esc_html__( 'Arbitrary Term Field', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => $prefix . 'term_text_field',
|
|
'type' => 'text',
|
|
) );
|
|
|
|
}
|
|
|
|
add_action( 'cmb2_admin_init', 'yourprefix_register_theme_options_metabox' );
|
|
/**
|
|
* Hook in and register a metabox to handle a theme options page and adds a menu item.
|
|
*/
|
|
function yourprefix_register_theme_options_metabox() {
|
|
|
|
/**
|
|
* Registers options page menu item and form.
|
|
*/
|
|
$cmb_options = new_cmb2_box( array(
|
|
'id' => 'yourprefix_theme_options_page',
|
|
'title' => esc_html__( 'Theme Options', 'cmb2' ),
|
|
'object_types' => array( 'options-page' ),
|
|
|
|
/*
|
|
* The following parameters are specific to the options-page box
|
|
* Several of these parameters are passed along to add_menu_page()/add_submenu_page().
|
|
*/
|
|
|
|
'option_key' => 'yourprefix_theme_options', // The option key and admin menu page slug.
|
|
'icon_url' => 'dashicons-palmtree', // Menu icon. Only applicable if 'parent_slug' is left empty.
|
|
// 'menu_title' => esc_html__( 'Options', 'cmb2' ), // Falls back to 'title' (above).
|
|
// 'parent_slug' => 'themes.php', // Make options page a submenu item of the themes menu.
|
|
// 'capability' => 'manage_options', // Cap required to view options-page.
|
|
// 'position' => 1, // Menu position. Only applicable if 'parent_slug' is left empty.
|
|
// 'admin_menu_hook' => 'network_admin_menu', // 'network_admin_menu' to add network-level options page.
|
|
// 'display_cb' => false, // Override the options-page form output (CMB2_Hookup::options_page_output()).
|
|
// 'save_button' => esc_html__( 'Save Theme Options', 'cmb2' ), // The text for the options-page save button. Defaults to 'Save'.
|
|
// 'disable_settings_errors' => true, // On settings pages (not options-general.php sub-pages), allows disabling.
|
|
// 'message_cb' => 'yourprefix_options_page_message_callback',
|
|
// 'tab_group' => '', // Tab-group identifier, enables options page tab navigation.
|
|
// 'tab_title' => null, // Falls back to 'title' (above).
|
|
// 'autoload' => false, // Defaults to true, the options-page option will be autloaded.
|
|
) );
|
|
|
|
/**
|
|
* Options fields ids only need
|
|
* to be unique within this box.
|
|
* Prefix is not needed.
|
|
*/
|
|
$cmb_options->add_field( array(
|
|
'name' => esc_html__( 'Site Background Color', 'cmb2' ),
|
|
'desc' => esc_html__( 'field description (optional)', 'cmb2' ),
|
|
'id' => 'bg_color',
|
|
'type' => 'colorpicker',
|
|
'default' => '#ffffff',
|
|
) );
|
|
|
|
}
|
|
|
|
/**
|
|
* Callback to define the optionss-saved message.
|
|
*
|
|
* @param CMB2 $cmb The CMB2 object.
|
|
* @param array $args {
|
|
* An array of message arguments
|
|
*
|
|
* @type bool $is_options_page Whether current page is this options page.
|
|
* @type bool $should_notify Whether options were saved and we should be notified.
|
|
* @type bool $is_updated Whether options were updated with save (or stayed the same).
|
|
* @type string $setting For add_settings_error(), Slug title of the setting to which
|
|
* this error applies.
|
|
* @type string $code For add_settings_error(), Slug-name to identify the error.
|
|
* Used as part of 'id' attribute in HTML output.
|
|
* @type string $message For add_settings_error(), The formatted message text to display
|
|
* to the user (will be shown inside styled `<div>` and `<p>` tags).
|
|
* Will be 'Settings updated.' if $is_updated is true, else 'Nothing to update.'
|
|
* @type string $type For add_settings_error(), Message type, controls HTML class.
|
|
* Accepts 'error', 'updated', '', 'notice-warning', etc.
|
|
* Will be 'updated' if $is_updated is true, else 'notice-warning'.
|
|
* }
|
|
*/
|
|
function yourprefix_options_page_message_callback( $cmb, $args ) {
|
|
if ( ! empty( $args['should_notify'] ) ) {
|
|
|
|
if ( $args['is_updated'] ) {
|
|
|
|
// Modify the updated message.
|
|
$args['message'] = sprintf( esc_html__( '%s — Updated!', 'cmb2' ), $cmb->prop( 'title' ) );
|
|
}
|
|
|
|
add_settings_error( $args['setting'], $args['code'], $args['message'], $args['type'] );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Only show this box in the CMB2 REST API if the user is logged in.
|
|
*
|
|
* @param bool $is_allowed Whether this box and its fields are allowed to be viewed.
|
|
* @param CMB2_REST_Controller $cmb_controller The controller object.
|
|
* CMB2 object available via `$cmb_controller->rest_box->cmb`.
|
|
*
|
|
* @return bool Whether this box and its fields are allowed to be viewed.
|
|
*/
|
|
function yourprefix_limit_rest_view_to_logged_in_users( $is_allowed, $cmb_controller ) {
|
|
if ( ! is_user_logged_in() ) {
|
|
$is_allowed = false;
|
|
}
|
|
|
|
return $is_allowed;
|
|
}
|
|
|
|
add_action( 'cmb2_init', 'yourprefix_register_rest_api_box' );
|
|
/**
|
|
* Hook in and add a box to be available in the CMB2 REST API. Can only happen on the 'cmb2_init' hook.
|
|
* More info: https://github.com/CMB2/CMB2/wiki/REST-API
|
|
*/
|
|
function yourprefix_register_rest_api_box() {
|
|
$prefix = 'yourprefix_rest_';
|
|
|
|
$cmb_rest = new_cmb2_box( array(
|
|
'id' => $prefix . 'metabox',
|
|
'title' => esc_html__( 'REST Test Box', 'cmb2' ),
|
|
'object_types' => array( 'page' ), // Post type
|
|
'show_in_rest' => WP_REST_Server::ALLMETHODS, // WP_REST_Server::READABLE|WP_REST_Server::EDITABLE, // Determines which HTTP methods the box is visible in.
|
|
// Optional callback to limit box visibility.
|
|
// See: https://github.com/CMB2/CMB2/wiki/REST-API#permissions
|
|
// 'get_box_permissions_check_cb' => 'yourprefix_limit_rest_view_to_logged_in_users',
|
|
) );
|
|
|
|
$cmb_rest->add_field( array(
|
|
'name' => esc_html__( 'REST Test Text', 'cmb2' ),
|
|
'desc' => esc_html__( 'Will show in the REST API for this box and for pages.', 'cmb2' ),
|
|
'id' => $prefix . 'text',
|
|
'type' => 'text',
|
|
) );
|
|
|
|
$cmb_rest->add_field( array(
|
|
'name' => esc_html__( 'REST Editable Test Text', 'cmb2' ),
|
|
'desc' => esc_html__( 'Will show in REST API "editable" contexts only (`POST` requests).', 'cmb2' ),
|
|
'id' => $prefix . 'editable_text',
|
|
'type' => 'text',
|
|
'show_in_rest' => WP_REST_Server::EDITABLE,// WP_REST_Server::ALLMETHODS|WP_REST_Server::READABLE, // Determines which HTTP methods the field is visible in. Will override the cmb2_box 'show_in_rest' param.
|
|
) );
|
|
}
|