'custom_action', 'label' => '', 'class' => 'button-secondary', 'wait_label' => '', 'success_label' => '', 'error_label' => '', 'success_callback' => '', 'error_callback' => '', 'data_filter_callback' => '', ); /** * This is first called when an ajax button is clicked. This checks whether the nonce * is valid and if we should continue; * * @return void */ public function ajaxSecurityChecker() { if ( empty( $_POST['nonce'] ) ) { wp_send_json_error( __( 'Security check failed, please refresh the page and try again.', 'mobile-menu' ) ); } if ( ! wp_verify_nonce( $_POST['nonce'], 'mm-ajax-button' ) ) { wp_send_json_error( __( 'Security check failed, please refresh the page and try again.', 'mobile-menu' ) ); } } /** * This is last called when an ajax button is clicked. This just exist with a successful state, * since doing nothing reads as an error with wp.ajax * * @return void */ public function ajaxLastSuccess() { wp_send_json_success(); } /** * Constructor, fixes the settings to allow for multiple ajax buttons in a single option * * @param $settings Array Option settings * @param $owner Object The container of the option * @return void */ function __construct( $settings, $owner ) { parent::__construct( $settings, $owner ); add_action( 'admin_head', array( __CLASS__, 'createAjaxScript' ) ); // Adjust the settings foreach ( $this->defaultSecondarySettings as $key => $default ) { if ( ! is_array( $this->settings[ $key ] ) ) { $this->settings[ $key ] = array( $this->settings[ $key ] ); } } while ( count( $this->settings['label'] ) < count( $this->settings['action'] ) ) { $this->settings['label'][] = $this->settings['label'][ count( $this->settings['label'] ) - 1 ]; } while ( count( $this->settings['class'] ) < count( $this->settings['action'] ) ) { $this->settings['class'][] = 'button-secondary'; } while ( count( $this->settings['wait_label'] ) < count( $this->settings['action'] ) ) { $this->settings['wait_label'][] = $this->settings['wait_label'][ count( $this->settings['wait_label'] ) - 1 ]; } while ( count( $this->settings['error_label'] ) < count( $this->settings['action'] ) ) { $this->settings['error_label'][] = $this->settings['error_label'][ count( $this->settings['error_label'] ) - 1 ]; } while ( count( $this->settings['success_label'] ) < count( $this->settings['action'] ) ) { $this->settings['success_label'][] = $this->settings['success_label'][ count( $this->settings['success_label'] ) - 1 ]; } while ( count( $this->settings['success_callback'] ) < count( $this->settings['action'] ) ) { $this->settings['success_callback'][] = ''; } while ( count( $this->settings['error_callback'] ) < count( $this->settings['action'] ) ) { $this->settings['error_callback'][] = __( 'Something went wrong', 'mobile-menu' ); } while ( count( $this->settings['data_filter_callback'] ) < count( $this->settings['action'] ) ) { $this->settings['data_filter_callback'][] = ''; } foreach ( $this->settings['label'] as $i => $label ) { if ( empty( $label ) ) { $this->settings['label'][ $i ] = __( 'Click me', 'mobile-menu' ); } } foreach ( $this->settings['wait_label'] as $i => $label ) { if ( empty( $label ) ) { $this->settings['wait_label'][ $i ] = __( 'Please wait...', 'mobile-menu' ); } } foreach ( $this->settings['error_label'] as $i => $label ) { if ( empty( $label ) ) { $this->settings['error_label'][ $i ] = $this->settings['label'][ $i ]; } } foreach ( $this->settings['success_label'] as $i => $label ) { if ( empty( $label ) ) { $this->settings['success_label'][ $i ] = $this->settings['label'][ $i ]; } } /** * Create ajax handlers for security and last resort success returns */ foreach ( $this->settings['action'] as $i => $action ) { if ( ! empty( $action ) ) { add_action( 'wp_ajax_' . $action, array( $this, 'ajaxSecurityChecker' ), 1 ); add_action( 'wp_ajax_' . $action, array( $this, 'ajaxLastSuccess' ), 99999 ); } } } /** * Renders the option * * @return void */ public function display() { $this->echoOptionHeader(); foreach ( $this->settings['action'] as $i => $action ) { printf( '', $this->settings['class'][ $i ], esc_attr( $action ), esc_attr( $this->settings['label'][ $i ] ), esc_attr( $this->settings['wait_label'][ $i ] ), esc_attr( $this->settings['error_label'][ $i ] ), esc_attr( $this->settings['success_label'][ $i ] ), esc_attr( wp_create_nonce( 'mm-ajax-button' ) ), esc_attr( $this->settings['success_callback'][ $i ] ), esc_attr( $this->settings['error_callback'][ $i ] ), esc_attr( $this->settings['data_filter_callback'][ $i ] ), esc_attr( $this->settings['label'][ $i ] ) ); } $this->echoOptionFooter(); } /** * Prints the Javascript needed by ajax buttons. The script is only echoed once * * @return void */ public static function createAjaxScript() { if ( ! self::$firstLoad ) { return; } self::$firstLoad = false; ?>