Overview

Classes

  • Papi_Admin
  • Papi_Admin_Ajax
  • Papi_Admin_Assets
  • Papi_Admin_Management_Pages
  • Papi_Admin_Menu
  • Papi_Admin_Meta_Box
  • Papi_Admin_Meta_Box_Tabs
  • Papi_Admin_Option_Handler
  • Papi_Admin_Post_Handler
  • Papi_Admin_View
  • Papi_Attachment_Type
  • Papi_Conditional_Rules
  • Papi_Container
  • Papi_Core_Autoload
  • Papi_Core_Conditional
  • Papi_Core_Conditional_Rule
  • Papi_Core_Data_Handler
  • Papi_Core_Page
  • Papi_Core_Property
  • Papi_Core_Type
  • Papi_Loader
  • Papi_Option_Page
  • Papi_Option_Type
  • Papi_Page_Type
  • Papi_Page_Type_Meta
  • Papi_Porter
  • Papi_Porter_Driver
  • Papi_Porter_Driver_Core
  • Papi_Post_Page
  • Papi_Property
  • Papi_Property_Bool
  • Papi_Property_Checkbox
  • Papi_Property_Color
  • Papi_Property_Datetime
  • Papi_Property_Divider
  • Papi_Property_Dropdown
  • Papi_Property_Editor
  • Papi_Property_Email
  • Papi_Property_File
  • Papi_Property_Flexible
  • Papi_Property_Gallery
  • Papi_Property_Hidden
  • Papi_Property_Html
  • Papi_Property_Image
  • Papi_Property_Link
  • Papi_Property_Number
  • Papi_Property_Post
  • Papi_Property_Radio
  • Papi_Property_Reference
  • Papi_Property_Relationship
  • Papi_Property_Repeater
  • Papi_Property_String
  • Papi_Property_Term
  • Papi_Property_Text
  • Papi_Property_Url
  • Papi_Property_User

Functions

  • current_page
  • papi
  • papi_action_delete_value
  • papi_action_include
  • papi_append_post_type_query
  • papi_body_class
  • papi_cache_delete
  • papi_cache_get
  • papi_cache_key
  • papi_cache_set
  • papi_camel_case
  • papi_cast_string_value
  • papi_convert_to_string
  • papi_current_user_is_allowed
  • papi_dashify
  • papi_delete_field
  • papi_delete_option
  • papi_delete_property_meta_value
  • papi_display_page_type
  • papi_doing_ajax
  • papi_esc_html
  • papi_f
  • papi_field
  • papi_field_shortcode
  • papi_field_value
  • papi_fields
  • papi_filter_conditional_rule_allowed
  • papi_filter_core_load_one_type_on
  • papi_filter_format_value
  • papi_filter_load_value
  • papi_filter_settings_directories
  • papi_filter_settings_only_page_type
  • papi_filter_settings_page_type_column_title
  • papi_filter_settings_show_page_type
  • papi_filter_settings_show_standard_page_type
  • papi_filter_settings_show_standard_page_type_in_filter
  • papi_filter_settings_sort_order
  • papi_filter_settings_standard_page_description
  • papi_filter_settings_standard_page_name
  • papi_filter_settings_standard_page_thumbnail
  • papi_filter_update_value
  • papi_from_property_array_slugs
  • papi_get_all_files_in_directory
  • papi_get_all_page_type_files
  • papi_get_all_page_types
  • papi_get_box_property
  • papi_get_class_name
  • papi_get_field
  • papi_get_file_path
  • papi_get_number_of_pages
  • papi_get_only_objects
  • papi_get_option
  • papi_get_options_and_properties
  • papi_get_or_post
  • papi_get_page
  • papi_get_page_new_url
  • papi_get_page_query_strings
  • papi_get_page_type
  • papi_get_page_type_base_path
  • papi_get_page_type_by_id
  • papi_get_page_type_by_post_id
  • papi_get_page_type_id
  • papi_get_page_type_key
  • papi_get_page_type_meta_value
  • papi_get_page_type_name
  • papi_get_page_type_template
  • papi_get_parent_post_id
  • papi_get_post_id
  • papi_get_post_type
  • papi_get_post_type_label
  • papi_get_post_types
  • papi_get_property_class_name
  • papi_get_property_meta_value
  • papi_get_property_options
  • papi_get_property_type
  • papi_get_property_type_key
  • papi_get_property_type_key_f
  • papi_get_qs
  • papi_get_sanitized_post
  • papi_get_slugs
  • papi_get_tab_options
  • papi_html_name
  • papi_html_tag
  • papi_include_template
  • papi_is_empty
  • papi_is_json
  • papi_is_method
  • papi_is_option_page
  • papi_is_option_type
  • papi_is_page_type
  • papi_is_property
  • papi_is_property_type_key
  • papi_is_rule
  • papi_management_page_type_render_box
  • papi_maybe_convert_to_array
  • papi_maybe_convert_to_object
  • papi_maybe_get_callable_value
  • papi_maybe_json_decode
  • papi_maybe_json_encode
  • papi_nl2br
  • papi_option_shortcode
  • papi_option_type_exists
  • papi_page_type_exists
  • papi_populate_properties
  • papi_property
  • papi_remove_papi
  • papi_remove_trailing_quotes
  • papi_render_html_tag
  • papi_render_properties
  • papi_render_property
  • papi_require_text
  • papi_required_html
  • papi_rule
  • papi_santize_data
  • papi_set_page_type_id
  • papi_setup_tabs
  • papi_slugify
  • papi_sort_order
  • papi_tab
  • papi_template
  • papi_template_include
  • papi_to_array
  • papi_to_property_array_slugs
  • papi_translate_keys
  • papi_underscorify
  • papi_update_field
  • papi_update_option
  • papi_update_property_meta_value
  • papi_with
  • papify
  • the_papi_field
  • the_papi_option
  • the_papi_page_type_name
  • Overview
  • Class
  1: <?php
  2: 
  3: /**
  4:  * Admin class that handles admin meta boxes.
  5:  */
  6: final class Papi_Admin_Meta_Box {
  7: 
  8:     /**
  9:      * Meta box default options.
 10:      *
 11:      * @var array
 12:      */
 13:     private $default_options = [
 14:         'capabilities' => [],
 15:         'context'      => 'normal',
 16:         'priority'     => 'default',
 17:         'properties'   => [],
 18:         'sort_order'   => null,
 19:         'title'        => '',
 20:         // Private options
 21:         '_id'          => '',
 22:         '_post_type'   => 'page',
 23:         '_required'    => false,
 24:         '_tab_box'     => false
 25:     ];
 26: 
 27:     /**
 28:      * Meta box options.
 29:      *
 30:      * @var object
 31:      */
 32:     private $options;
 33: 
 34:     /**
 35:      * Contains all root level properties in this meta box.
 36:      *
 37:      * @var array
 38:      */
 39:     private $properties = [];
 40: 
 41:     /**
 42:      * The constructor.
 43:      *
 44:      * @param array $options
 45:      * @param array $properties
 46:      */
 47:     public function __construct( $options = [], $properties = [] ) {
 48:         if ( empty( $options ) ) {
 49:             return;
 50:         }
 51: 
 52:         $this->setup_options( $options );
 53: 
 54:         // Check if the current user is allowed to view this box.
 55:         if ( ! papi_current_user_is_allowed( $this->options->capabilities ) ) {
 56:             return;
 57:         }
 58: 
 59:         $this->populate_properties( $properties );
 60: 
 61:         $this->setup_actions();
 62:     }
 63: 
 64:     /**
 65:      * Add property.
 66:      *
 67:      * @param object $property
 68:      */
 69:     public function add_property( $property ) {
 70:         $this->properties[] = $property;
 71:     }
 72: 
 73:     /**
 74:      * Get meta box id.
 75:      *
 76:      * @param string $slug
 77:      *
 78:      * @return string
 79:      */
 80:     private function get_meta_box_id( $slug ) {
 81:         return papi_f( papi_underscorify( papify( $slug ) ) );
 82:     }
 83: 
 84:     /**
 85:      * Add css classes to meta box.
 86:      *
 87:      * @param  array $classes
 88:      *
 89:      * @return string[]
 90:      */
 91:     public function meta_box_css_classes( $classes ) {
 92:         return array_merge( $classes, [
 93:             'papi-box'
 94:         ] );
 95:     }
 96: 
 97:     /**
 98:      * Move meta boxes after title.
 99:      */
100:     public function move_meta_box_after_title() {
101:         global $post, $wp_meta_boxes;
102:         do_meta_boxes( get_current_screen(), $this->options->context, $post );
103:         unset( $wp_meta_boxes[get_post_type( $post )][$this->options->context] );
104:     }
105: 
106:     /**
107:      * Populate post type.
108:      *
109:      * @param  array|string $post_type
110:      *
111:      * @return string
112:      */
113:     private function populate_post_type( $post_type ) {
114:         $post_id = papi_get_post_id();
115: 
116:         if ( $post_id !== 0 ) {
117:             return get_post_type( $post_id );
118:         }
119: 
120:         // Get the post type that we currently are on if it exist in the array of post types.
121:         $post_type = array_filter( papi_to_array( $post_type ), function ( $post_type ) {
122:             // Support fake post types.
123:             if ( strpos( $post_type, '_papi' ) !== false ) {
124:                 return true;
125:             }
126: 
127:             return ! empty( $post_type ) &&
128:                 strtolower( $post_type ) === strtolower(
129:                     papi_get_or_post( 'post_type' )
130:                 );
131:         } );
132: 
133:         if ( ! empty( $post_type ) ) {
134:             return $post_type[0];
135:         }
136: 
137:         return 'page';
138:     }
139: 
140:     /**
141:      * Populate the properties array
142:      *
143:      * @param array $properties
144:      */
145:     private function populate_properties( $properties ) {
146:         $this->properties = papi_populate_properties( $properties );
147: 
148:         if ( ! empty( $this->properties ) ) {
149:             $this->options->_tab_box = isset( $this->properties[0]->tab ) &&
150:                 $this->properties[0]->tab;
151:         }
152:     }
153: 
154:     /**
155:      * Render the meta box
156:      *
157:      * @param array $post
158:      * @param array $args
159:      */
160:     public function render_meta_box( $post, $args ) {
161:         if ( ! is_array( $args ) || ! isset( $args['args'] ) ) {
162:             return;
163:         }
164: 
165:         // Render the properties.
166:         papi_render_properties( $args['args'] );
167:     }
168: 
169:     /**
170:      * Setup actions.
171:      */
172:     private function setup_actions() {
173:         if ( post_type_exists( $this->options->_post_type ) ) {
174:             add_action( 'add_meta_boxes', [$this, 'setup_meta_box'] );
175: 
176:             if ( $this->options->context === 'after_title' ) {
177:                 add_action( 'edit_form_after_title', [$this, 'move_meta_box_after_title'] );
178:             }
179:         } else {
180:             $this->setup_meta_box();
181:         }
182: 
183:         // Will be called on when you call do_meta_boxes
184:         // even without a real post type.
185:         add_action(
186:             sprintf(
187:                 'postbox_classes_%s_%s',
188:                 $this->options->_post_type,
189:                 $this->options->_id
190:             ),
191:             [$this, 'meta_box_css_classes']
192:         );
193:     }
194: 
195:     /**
196:      * Setup meta box.
197:      */
198:     public function setup_meta_box() {
199:         $this->options->title = papi_remove_papi( $this->options->title );
200: 
201:         if ( $this->options->_required ) {
202:             $this->options->title .= papi_required_html(
203:                 $this->properties[0],
204:                 true
205:             );
206:         }
207: 
208:         add_meta_box(
209:             $this->options->_id,
210:             $this->options->title,
211:             [ $this, 'render_meta_box' ],
212:             $this->options->_post_type,
213:             $this->options->context,
214:             $this->options->priority,
215:             $this->properties
216:         );
217:     }
218: 
219:     /**
220:      * Setup options
221:      *
222:      * @param array $options
223:      */
224:     private function setup_options( $options ) {
225:         $options                   = empty( $options ) ? [] : $options;
226:         $options                   = array_merge( $this->default_options, $options );
227:         $this->options             = (object) $options;
228:         $this->options->title      = ucfirst( $this->options->title );
229:         $this->options->slug       = papi_slugify( $this->options->title );
230:         $this->options->_id        = $this->get_meta_box_id(
231:             $this->options->slug
232:         );
233:         $this->options->_post_type = $this->populate_post_type(
234:             $this->options->_post_type
235:         );
236:     }
237: }
238: 
API documentation generated by ApiGen