<?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();
}