Wordpress Ajax重新加载更新的查询变量

时间:2016-12-09 22:21:23

标签: jquery ajax wordpress

我创建了一个前端过滤器,用于修改网址中的查询变量。

http://example.com/events/?zone=strength&days=28th&locations=136

区域和天数是分类法,location是来自自定义字段的元查询。

我有3个选择输入,其中包含每个查询var的列表,当您选择其中一个页面时,页面会在网址中重新加载新查询,并且按预期工作。

一切正常,但我认为让ajax重新加载循环而不是完整的页面加载会使它更好。

我的jQuery(可能写得不好):



// function to split up URL queries
function getQueryVariable(variable) {
  var query = window.location.search.substring(1);
  var vars = query.split('&');
  for (var i=0; i<vars.length; i++) {
    var pair = vars[i].split('=');
    if (pair[0] == variable) {
      return pair[1];
    }
  }

  return false;
}	

// on ready, set the select values to the url queries
var zone = getQueryVariable('zone');
var days = getQueryVariable('days');
var locations = getQueryVariable('locations');

if(zone) {
  $(".event-filter .zone").val(zone);	
}
if(days) {
  $(".event-filter .day").val(days);	
}
if(locations) {
  $(".event-filter .location").val(locations);
}

// on select change, detect what changed and update url
jQuery('.event-filter select').on('change', function() {

  var params = {};

  if($(".event-filter .zone option:selected").val() != 'zone'){
    var zone = $(".event-filter .zone option:selected").val();
    params['zone'] = zone;
  }
  if($(".event-filter .day option:selected").val() != 'day'){
    var days = $(".event-filter .day option:selected").val()	
    params['days'] = days;
  }
  if($(".event-filter .location option:selected").val() != 'location'){
    var locations = $(".event-filter .location option:selected").val()
    params['locations'] = locations;
  }
  // create new url
  var path = window.location.pathname;
  if ($.isEmptyObject(params)) {
    var new_url = path;	
  } else {
    var new_url = path + '?' + jQuery.param(params);					
  }

  // reload page
  window.location.href = new_url;						

});	
&#13;
&#13;
&#13;

我想将new_url变量作为带有ajax的url重新加载,并使用新的查询变量再次运行循环。

My Loop:

&#13;
&#13;
// Check if query vars are being used in the URL. 
$days = get_query_var('days',FALSE);
$zone = get_query_var('zone',FALSE);	

// Created tax_query array, supporting multiple arrays where all conditions must be met 
$tax_query = array('relation' => 'AND');

// Set days variable with terms from the query var in url
if( ($days) ) {
  $tax_query[] = array(
    'taxonomy'  => 'day',
    'field'     => 'slug',
    'terms'     => $days,
  );
}

// Set zone variable with terms from the query var in url
if( ($zone)) {
  $tax_query[] = array(
    taxonomy'  => 'zone',
    'field'     => 'slug',
    'terms'     => $zone,
  );
}

// Check if locations query var is used
if(isset($_GET['locations']) && !empty($_GET['locations'])){
  $locations[] = array(
    'key' => 'event_location',
    'value' => $_GET['locations'],
    'compare' => 'IN'
  );
}

// Load both taxonomy query and meta query arrays into their respective args!
$args = array( 
  'post_type' => 'event', 
  'posts_per_page' => -1,
  'tax_query' => $tax_query,
  'meta_query' => $locations
);

$events = new WP_Query( $args );?>
&#13;
&#13;
&#13;

我的想法是我应该用上面的循环创建一个函数,只要用jQuery / ajax改变select字段就会调用它,而不是重新加载页面。这是对的吗?

如何从更改的new_url jquery变量中仅加载包含循环的部分而不加载整个页面?

1 个答案:

答案 0 :(得分:1)

好的,您希望调整当前的方法,用AJAX解决方案替换重定向(重新加载)。

  

如何从更改的new_url jquery变量中仅加载包含循环的部分而不加载整个页面?

让我们考虑一下处理:

  1. 您将像现在一样获取参数,但它们将成为通过$.post()返回服务器的数据包的一部分。
  2. 您将删除将查询变量附加到URL并执行重新加载的代码。这不再需要了。
  3. 然后使用$.post您将参数发送到服务器。然后服务器检查安全性随机数。如果没关系,可以运行PHP代码来获取查询并构建事件HTML。
  4. 然后,服务器回显新的HTML并执行die()wp_die()
  5. 脚本$.post接收响应,即新的HTML字符串。然后,您将删除旧的HTML并将其替换为新的。
  6. 还在我身边吗?让我们来看看将代码转换为新方法所需要做的事情。我写了一个答案,向另一个PO解释,you can find it here

    设置脚本的URL目标

    AJAX需要一个URL来与服务器通话。在WordPress中,我们使用admin-ajax.php文件。当您入队时,您将需要本地化参数以将其从服务器传递到脚本。

    wp_enqueue_script( 'your-script-handle', 'path-to/filename.js', array('jquery'), $version );
    wp_localize_script( 'your-script-handle', 'eventParams', array(
        'ajaxurl' => admin_url( 'admin-ajax.php' ),
    ));
    

    请注意,localize命令的目标是在您将脚本排入队列时为其提供的句柄。它的作用是:

    • 将数组传递给脚本
    • 使用变量eventParams
    • 将其作为对象存储在脚本中

    在脚本中,您将收到使用admin ajax URL,如下所示:

    $.post( eventParams.ajaxurl, dataPacket, function(htmlResponse) {
    
    });
    

    安全

    接下来,您需要添加一个nonce以确保安全性。我建议添加hidden input field

    构建数据包

    jQuery $.post()构造将数据包传递给服务器。您可以在上面看到我将其设置为名为dataPacket的变量。您需要在运行$.post()之前构建该对象。

    我已将您的代码作为起点进行调整:

    (function($, window, document){
        "use strict";
    
        var init = function() {
            $('.event-filter select').on('change', eventSelectHandler);
        }
    
        var eventSelectHandler = function() {
    
            var dataPacket = {
                action: 'event_filter',
                security: getSecurity(),
                zone: getZone(),
                days: getDay(),
                locations: getLocation()
            };
    
            $.post( eventParams.ajaxurl, dataPacket, function(htmlResponse) {
                // add your processing code
            });
    
        }
    
        function getSecurity() {
            // you'll grab that from the nonce field and then
            // return it.
        }
    
        function getZone() {
            return getSelected( '.zone', 'zone' );
        }
    
        function getDay() {
            return getSelected( '.day', 'day' );
        }
    
        function getLocation() {
            return getSelected( '.location', 'location' );
        }
    
        function getSelected( classAttribute, compareValue ) {
            var $element = $( ".event-filter " + classAttribute + " option:selected");
            if ( $element.length < 1 ) {
                return '';
            }
    
            var optionSelected = $element.val();
    
            if ( optionSelected != compareValue ) {
                return optionSelected;
            }
    
            return '';
        }
    
        $(document).ready(function(){
            init();
        });
    
    }(jQuery, window, document));
    

    查看函数eventSelectHandler()。请注意,您首先要构建数据包。然后,一旦你构建它,它就会被传递到$.post

    PHP Side

    现在在PHP方面,您需要为WordPress AJAX事件注册一个回调函数。这些由您在数据包中提供的操作名称确定。

    您将为登录用户使用wp_ajax_{your action name},为访客使用wp_ajax_nopriv_{your action name}

    看起来像这样:

    add_action( 'wp_ajax_event_filter', 'process_event_filter_ajax_request' );
    add_action( 'wp_ajax_nopriv_event_filter', 'process_event_filter_ajax_request' );
    function process_event_filter_ajax_request() {
        // Check the security nonce first
        // If it fails, it returns immediately.
    
        // The parameters are in $_POST['zone']
        $zone     = strip_tags( $_POST['zone'] );
        $days     = strip_tags( $_POST['days'] );
        $location = strip_tags( $_POST['location'] );
    
        // do your work here
    
        // build the HTML
    
        wp_die();
    }
    

    使用WP_Query处理的代码将成为上述AJAX处理的一部分。您需要将代码调整为上述回调。

    这应该足以让你开始走上正轨。