160 lines
3.6 KiB
PHP
160 lines
3.6 KiB
PHP
<?php
|
|
|
|
/**
|
|
* bbPress Common AJAX Functions
|
|
*
|
|
* Common AJAX functions are ones that are used to setup and/or use during
|
|
* bbPress specific, theme-side AJAX requests.
|
|
*
|
|
* @package bbPress
|
|
* @subpackage Ajax
|
|
*/
|
|
|
|
// Exit if accessed directly
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* Output the URL to use for theme-side bbPress AJAX requests
|
|
*
|
|
* @since 2.3.0 bbPress (r4543)
|
|
*/
|
|
function bbp_ajax_url() {
|
|
echo esc_url( bbp_get_ajax_url() );
|
|
}
|
|
/**
|
|
* Return the URL to use for theme-side bbPress AJAX requests
|
|
*
|
|
* @since 2.3.0 bbPress (r4543)
|
|
*
|
|
* @global WP $wp
|
|
* @return string
|
|
*/
|
|
function bbp_get_ajax_url() {
|
|
global $wp;
|
|
|
|
$ssl = bbp_get_url_scheme();
|
|
$url = trailingslashit( $wp->request );
|
|
$base_url = home_url( $url, $ssl );
|
|
$ajaxurl = add_query_arg( array( 'bbp-ajax' => 'true' ), $base_url );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_ajax_url', $ajaxurl );
|
|
}
|
|
|
|
/**
|
|
* Is this a bbPress AJAX request?
|
|
*
|
|
* @since 2.3.0 bbPress (r4543)
|
|
*
|
|
* @return bool Looking for bbp-ajax
|
|
*/
|
|
function bbp_is_ajax() {
|
|
return (bool) ( ( isset( $_GET['bbp-ajax'] ) || isset( $_POST['bbp-ajax'] ) ) && ! empty( $_REQUEST['action'] ) );
|
|
}
|
|
|
|
/**
|
|
* Hooked to the 'bbp_template_redirect' action, this is also the custom
|
|
* theme-side AJAX handler.
|
|
*
|
|
* This is largely taken from admin-ajax.php, but adapted specifically for
|
|
* theme-side bbPress-only AJAX requests.
|
|
*
|
|
* @since 2.3.0 bbPress (r4543)
|
|
*
|
|
* @param string $action Sanitized action from bbp_post_request/bbp_get_request
|
|
*
|
|
* @return If not a bbPress AJAX request
|
|
*/
|
|
function bbp_do_ajax( $action = '' ) {
|
|
|
|
// Bail if not a bbPress specific AJAX request
|
|
if ( ! bbp_is_ajax() ) {
|
|
return;
|
|
}
|
|
|
|
// Set WordPress core AJAX constant for back-compat
|
|
if ( ! defined( 'DOING_AJAX' ) ) {
|
|
define( 'DOING_AJAX', true );
|
|
}
|
|
|
|
// Setup AJAX headers
|
|
bbp_ajax_headers();
|
|
|
|
// Compat for targeted action hooks (without $action param)
|
|
$action = empty( $action )
|
|
? sanitize_key( $_REQUEST['action'] ) // isset checked by bbp_is_ajax()
|
|
: $action;
|
|
|
|
// Setup action key
|
|
$key = "bbp_ajax_{$action}";
|
|
|
|
// Bail if no action is registered
|
|
if ( empty( $action ) || ! has_action( $key ) ) {
|
|
wp_die( '0', 400 );
|
|
}
|
|
|
|
// Everything is 200 OK.
|
|
bbp_set_200();
|
|
|
|
// Execute custom bbPress AJAX action
|
|
do_action( $key );
|
|
|
|
// All done
|
|
wp_die( '0' );
|
|
}
|
|
|
|
/**
|
|
* Send headers for AJAX specific requests
|
|
*
|
|
* This was abstracted from bbp_do_ajax() for use in custom theme-side AJAX
|
|
* implementations.
|
|
*
|
|
* @since 2.6.0 bbPress (r6757)
|
|
*/
|
|
function bbp_ajax_headers() {
|
|
|
|
// Set the header content type
|
|
@header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );
|
|
@header( 'X-Robots-Tag: noindex' );
|
|
|
|
// Disable content sniffing in browsers that support it
|
|
send_nosniff_header();
|
|
|
|
// Disable browser caching for all AJAX requests
|
|
nocache_headers();
|
|
}
|
|
|
|
/**
|
|
* Helper method to return JSON response for bbPress AJAX calls
|
|
*
|
|
* @since 2.3.0 bbPress (r4542)
|
|
*
|
|
* @param bool $success
|
|
* @param string $content
|
|
* @param array $extras
|
|
*/
|
|
function bbp_ajax_response( $success = false, $content = '', $status = -1, $extras = array() ) {
|
|
|
|
// Set status to 200 if setting response as successful
|
|
if ( ( true === $success ) && ( -1 === $status ) ) {
|
|
$status = 200;
|
|
}
|
|
|
|
// Setup the response array
|
|
$response = array(
|
|
'success' => $success,
|
|
'status' => $status,
|
|
'content' => $content
|
|
);
|
|
|
|
// Merge extra response parameters in
|
|
if ( ! empty( $extras ) && is_array( $extras ) ) {
|
|
$response = array_merge( $response, $extras );
|
|
}
|
|
|
|
// Send back the JSON
|
|
@header( 'Content-type: application/json' );
|
|
echo json_encode( $response );
|
|
die();
|
|
}
|