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 handle ajax calls.
  5:  */
  6: class Papi_Admin_Ajax {
  7: 
  8:     /**
  9:      * The action prefix for Papi ajax actions.
 10:      *
 11:      * @var string
 12:      */
 13:     private $action_prefix = 'papi/ajax/';
 14: 
 15:     /**
 16:      * The constructor.
 17:      */
 18:     public function __construct() {
 19:         $this->setup_actions();
 20:     }
 21: 
 22:     /**
 23:      * Setup actions.
 24:      */
 25:     private function setup_actions() {
 26:         add_action( 'init', [$this, 'add_endpoint'] );
 27:         add_action( 'parse_query', [$this, 'handle_papi_ajax'] );
 28:         add_action( 'admin_enqueue_scripts', [$this, 'ajax_url'], 10 );
 29: 
 30:         // Ajax actions.
 31:         add_action( $this->action_prefix . 'get_property', [$this, 'get_property'] );
 32:         add_action( $this->action_prefix . 'get_properties', [$this, 'get_properties'] );
 33:         add_action( $this->action_prefix . 'get_rules_result', [$this, 'get_rules_result'] );
 34:     }
 35: 
 36:     /**
 37:      * Add ajax endpoint.
 38:      */
 39:     public function add_endpoint() {
 40:         add_rewrite_tag( '%action%', '([^/]*)' );
 41:         add_rewrite_rule( 'papi-ajax/([^/]*)/?', 'index.php?action=$matches[1]', 'top' );
 42:     }
 43: 
 44:     /**
 45:      * Add ajax url to Papi JavaScript object.
 46:      */
 47:     public function ajax_url() {
 48:         $url = esc_url( trailingslashit( get_bloginfo( 'url' ) ) . 'papi-ajax/' );
 49:         ?>
 50:         <script type="text/javascript">
 51:             var papi = papi || {};
 52:             papi.ajaxUrl = '<?php echo $url; ?>';
 53:         </script>
 54:         <?php
 55:     }
 56: 
 57:     /**
 58:      * Handle Papi ajax.
 59:      */
 60:     public function handle_papi_ajax() {
 61:         global $wp_query;
 62: 
 63:         if ( ! is_object( $wp_query ) ) {
 64:             return;
 65:         }
 66: 
 67:         if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
 68:             return;
 69:         }
 70: 
 71:         if ( ! papi_is_empty( papi_get_qs( 'action' ) ) ) {
 72:             $wp_query->set(
 73:                 'papi_ajax_action',
 74:                 papi_get_qs( 'action' )
 75:             );
 76:         }
 77: 
 78:         $ajax_action = $wp_query->get( 'papi_ajax_action' );
 79: 
 80:         if ( is_user_logged_in() && has_action( $this->action_prefix . $ajax_action ) !== false ) {
 81:             if ( ! defined( 'DOING_AJAX' ) ) {
 82:                 define( 'DOING_AJAX', true );
 83:             }
 84: 
 85:             if ( ! defined( 'DOING_PAPI_AJAX' ) ) {
 86:                 define( 'DOING_PAPI_AJAX', true );
 87:             }
 88: 
 89:             status_header( 200 );
 90:             do_action( $this->action_prefix . $ajax_action );
 91:             wp_die();
 92:         }
 93:     }
 94: 
 95:     /**
 96:      * Get property html via GET.
 97:      *
 98:      * GET /papi-ajax/?action=get_property
 99:      */
100:     public function get_property() {
101:         $default_options = Papi_Core_Property::create()->get_options();
102:         $keys            = array_keys( get_object_vars( $default_options ) );
103:         $options         = papi_get_qs( $keys, true );
104: 
105:         if ( $property = papi_property( $options ) ) {
106:             ob_start();
107: 
108:             $property->render_ajax_request();
109: 
110:             $html = ob_get_clean();
111: 
112:             wp_send_json( [
113:                 'html' => utf8_encode( $html )
114:             ] );
115:         } else {
116:             $this->render_error( 'No property found' );
117:         }
118:     }
119: 
120:     /**
121:      * Get properties via POST.
122:      *
123:      * POST /papi-ajax/?action=get_properties
124:      */
125:     public function get_properties() {
126:         if ( ! papi_get_sanitized_post( 'properties' ) ) {
127:             $this->render_error( 'No properties found' );
128:             return;
129:         }
130: 
131:         $items = json_decode(
132:             stripslashes( papi_get_sanitized_post( 'properties' ) ),
133:             true
134:         );
135: 
136:         if ( empty( $items ) || ! is_array( $items ) ) {
137:             $this->render_error( 'No properties found' );
138:             return;
139:         }
140: 
141:         foreach ( $items as $key => $item ) {
142:             $property = papi_property( (array) $item );
143: 
144:             if ( ! papi_is_property( $property ) ) {
145:                 unset( $items[$key] );
146:                 continue;
147:             }
148: 
149:             ob_start();
150: 
151:             $property->render_ajax_request();
152: 
153:             $items[$key] = trim( ob_get_clean() );
154:         }
155: 
156:         $items = array_filter( $items );
157: 
158:         if ( empty( $items ) ) {
159:             $this->render_error( 'No properties found' );
160:         } else {
161:             wp_send_json( [
162:                 'html' => $items
163:             ] );
164:         }
165:     }
166: 
167:     /**
168:      * Get rules result via GET.
169:      *
170:      * GET /papi-ajax/?action=get_rules_result
171:      */
172:     public function get_rules_result() {
173:         if ( ! papi_get_sanitized_post( 'data' ) ) {
174:             $this->render_error( 'No rule found' );
175:             return;
176:         }
177: 
178:         $data = json_decode(
179:             stripslashes( papi_get_sanitized_post( 'data' ) ),
180:             true
181:         );
182: 
183:         if ( empty( $data ) || ! is_array( $data ) || ! isset( $data['slug'] ) ) {
184:             $this->render_error( 'No rule found' );
185:             return;
186:         }
187: 
188:         $page_type = papi_get_page_type_by_post_id();
189: 
190:         if ( $page_type instanceof Papi_Page_Type === false ) {
191:             $this->render_error( 'No rule found' );
192:             return;
193:         }
194: 
195:         if ( preg_match( '/\[\]$/', $data['slug'] ) ) {
196:             $data['slug'] = preg_replace( '/\[\]$/', '', $data['slug'] );
197:         }
198: 
199:         if ( $property  = $page_type->get_property( $data['slug'] ) ) {
200:             wp_send_json( [
201:                 'render' => $property->render_is_allowed_by_rules(
202:                     $data['rules']
203:                 )
204:             ] );
205:         } else {
206:             $this->render_error( 'No rule found' );
207:         }
208:     }
209: 
210:     /**
211:      * Render error message.
212:      *
213:      * @param string $message
214:      */
215:     public function render_error( $message ) {
216:         wp_send_json( [
217:             'error' => $message
218:         ] );
219:     }
220: }
221: 
222: new Papi_Admin_Ajax;
223: 
API documentation generated by ApiGen