Skip to content

Instantly share code, notes, and snippets.

@radist2s
Last active June 23, 2017 11:55
Show Gist options
  • Save radist2s/7869129 to your computer and use it in GitHub Desktop.
Save radist2s/7869129 to your computer and use it in GitHub Desktop.
Wordpress ajax suffixer. (Need to work with WP chaching plugins like WP Super Cache, W3 Total cache, etc)If page has url "http://xmp.com/tax/tem/page-name" then ajax version of this page is "http://xmp.com/tax/tem/page-name/ajax"In template you can check AJAX request via const "IS_AJAX" (if (IS_AJAX){})
<?php
/**
* Detect ajax request
*/
add_filter('parse_request', function ($query_vars)
{
if (is_admin())
{
return $query_vars;
}
$query = & $query_vars->query_vars;
$is_ajax = false;
if (!empty($query['is_ajax']))
{
if ($query['is_ajax'])
{
$is_ajax = true;
}
unset($query['is_ajax']);
}
if (!empty($query['ajax_page']))
{
$is_ajax = true;
}
define('IS_AJAX', $is_ajax OR !empty($_REQUEST['is_ajax']));
if (IS_AJAX)
{
add_filter('redirect_canonical', function ($redirect_url, $requested_url)
{
return $requested_url;
}, 10, 2);
}
return $query_vars;
}, 0);
function is_ajax_request()
{
return defined('IS_AJAX') AND IS_AJAX;
}
/*
* Ajax template redirection
*/
add_action('template_redirect', function ()
{
if (is_ajax_request())
{
add_filter('template_include', 'ajax_template_include_action', 100, 1);
}
});
function ajax_template_include_action($template_include)
{
$suffix = (defined('AJAX_TEMPLATE_SUFFIX') AND constant('AJAX_TEMPLATE_SUFFIX')) ? AJAX_TEMPLATE_SUFFIX : 'ajax';
//Try load template with [ajax] suffix
//index-ajax.php, page-ajax.php, taxonomy-{name}-ajax.php, etc.
$ajax_template = trailingslashit(dirname($template_include)) . basename($template_include, '.php') . "-$suffix.php";
return is_file($ajax_template) ? $ajax_template : $template_include;
}
/**
* Class WP_Ajax_Suffix_Templater
*
* Add '/ajax' suffix to al links, and load for such links templates
*/
class WP_Ajax_Suffix_Templater
{
static $PREFIXES = array(
'is_ajax' => array('is_ajax=1', 'ajax'), // http://xmp.com/page-base/ajax
'ajax_page' => array('ajax_page=$matches[1]', 'ajax-page/(\d*+)'), // http://xmp.com/page-base/ajax_page/2
/*'is_ajax_query' => 'is_ajax_query-[^/]+'*/
);
function __construct()
{
if (!static::$PREFIXES)
{
return;
}
add_filter('rewrite_rules_array', array(&$this, 'rewrite_rules_array_filter'), 100);
add_filter('query_vars', array(&$this, 'query_vars_filter'));
add_action('wp_loaded', array(&$this, 'wp_loaded_action'));
}
function prefixes_checksum()
{
static $prefixes_checksum = NULL;
if ($prefixes_checksum !== NULL)
{
return $prefixes_checksum;
}
$prefixes = static::$PREFIXES;
$prefixes_checksum = '';
foreach ($prefixes AS $prefix => $rules_data)
{
$prefixes_checksum .= implode($rules_data) . $prefix;
}
return $prefixes_checksum = md5($prefixes_checksum);
}
function rewrite_rules_array_filter($global_rules)
{
$prefixes = static::$PREFIXES;
$prefixed_rules = array();
$prefixed_rules[self::prefixes_checksum()] = 'index.php';
foreach($prefixes AS $prefix => $rule_data)
{
$query = $rule_data[0];
$rule_pattern = $rule_data[1];
$prefixed_rules["$rule_pattern/?$"] = "index.php?$query";
foreach ($global_rules AS $global_rule => $global_query)
{
$global_rule = static::rule_rtrim_slash($global_rule);
$prefixed_rules["$global_rule/$rule_pattern/?$"] =
rtrim($global_query, '&=') . '&' . static::prepare_query($global_query, $query);
}
}
return array_merge($prefixed_rules, $global_rules);
}
function rule_rtrim_slash($rule)
{
return preg_replace('~/\?\$?$~iu', '', $rule);
}
function prepare_query($query, $appending_query)
{
$matches = array();
if (preg_match_all('~\$matches\[(\d+)\]~iu', $query, $matches))
{
$max_match = max($matches[1]);
$next_match = $max_match + 1;
$appending_query = str_replace('$matches[1]', '$matches[' . $next_match .']', $appending_query);
}
return $appending_query;
}
function wp_loaded_action()
{
$rules = get_option('rewrite_rules');
$prefixes_checksum = self::prefixes_checksum();
if (empty($rules[$prefixes_checksum]))
{
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
function query_vars_filter($vars)
{
foreach (static::$PREFIXES AS $prefix => $patter)
{
array_push($vars, $prefix);
}
return $vars;
}
}
$WP_Ajax_Prefixes_Templater = new WP_Ajax_Suffix_Templater();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment