【问题标题】:Ajax DATA changes sortingAjax DATA 改变排序
【发布时间】:2018-01-03 23:00:30
【问题描述】:

我正在使用我的 Wordpress 网站进行 AJAX 调用。除了从 SUCCESS 函数出来的数据的 ORDER(排序)之外,它工作得非常完美。

如果我 print_r ($service) 我验证了我想要的正确自定义订单

但之后发送使用:

(PHP 文件)

public function closest_services() {
    
    global $wpdb;
    
    $servicios_repetidos = $_POST['servicios_repetidos'];
    
    $lat        = $_POST['latitud'];
    $lng        = $_POST['longitud'];
    $categoria  = array();
    $unit       = $_POST['unit'];
    $distancia  = $_POST['radius'];
    
    if ( $unit == 'km' ) { $earth_radius = 6371.009 / 1.609344 ; }
    elseif ( $unit == 'mi' ) { $earth_radius = 3958.761; }
    
    $sql = $wpdb->prepare( "
        SELECT DISTINCT
            p.ID AS service_ID,
            p.post_title AS service_title,
            map_lat.meta_value AS locLat,
            map_lng.meta_value AS locLong,
            
            
            %f * 2 * ASIN(SQRT( POWER(SIN(( %f - map_lat.meta_value ) * pi()/180 / 2), 2) 
            + COS( %f * pi()/180) * COS( map_lng.meta_value * pi()/180) 
            * POWER(SIN(( %f - map_lng.meta_value) * pi()/180 / 2), 2) )) 
            AS distance
            
        FROM $wpdb->posts p
        INNER JOIN $wpdb->postmeta map_lat ON p.ID = map_lat.post_id
        INNER JOIN $wpdb->postmeta map_lng ON p.ID = map_lng.post_id
        WHERE 1 = 1
        AND p.post_type = 'servicios'
        AND p.post_status = 'publish'
        AND map_lat.meta_key = 'et_meta_latitud'
        AND map_lng.meta_key = 'et_meta_longitud'
        HAVING distance <= %d
        ORDER BY distance DESC",
        $earth_radius,
        $lat,
        $lat,
        $lng,
        $distancia      
    );
    
    $closest_services_query = $wpdb->get_results( $sql );
    $servicio = array();
    
    foreach ( $closest_services_query as $single_service ):
        
        $servicio[$single_service->service_ID]["service_ID"]            = $single_service->service_ID;
        $servicio[$single_service->service_ID]["meta_fields"]           = get_post_custom( $single_service->service_ID );
        $servicio[$single_service->service_ID]["service_author"]        = get_post_field ( 'post_author' , $single_service->service_ID );
        $servicio[$single_service->service_ID]["service_author_avatar"] = get_avatar( $single_service->service_ID , '64');
        $servicio[$single_service->service_ID]["service_author_url"]    = bp_core_get_user_domain( $single_service->service_ID );           
        $servicio[$single_service->service_ID]["category"]              = get_the_terms( $single_service->service_ID , 'servicios-categoria');
        $servicio[$single_service->service_ID]["service_title"]         = $single_service->service_title;
        
        $servicio[$single_service->service_ID]["thumb_url"]             = wp_get_attachment_image_src( get_post_thumbnail_id( $single_service->service_ID ) , 'medium' );
      
        $servicio[$single_service->service_ID]["distancia"]             = $single_service->distance;
        
        $servicio[$single_service->service_ID]["precio_servicio_visibilidad"] = get_post_meta( $single_service->service_ID , 'et_meta_precio_visibilidad' , true);
        
        if ( function_exists( 'get_favorites_button' ) ) 
            $servicio[$single_service->service_ID]["favorite_button"] = get_favorites_button( $single_service->service_ID );

    endforeach;
    
    //print_r($servicio);
    wp_send_json($servicio);
    
}

(JQUERY 文件)

function ajax_mapa () {                 
    var center = map.getCenter();
        
    latitud     = center.lat();
    longitud    = center.lng();
    
    jQuery( "body" ).after( "<div class='loading'>Loading&#8230;</div>" );
                                                
    jQuery.ajax({
        url: ajax_object.ajax_url,
        type: "POST",
        dataType: "JSON",
        
        data: { 
            'action'    : 'closest_services',
            'latitud'   : latitud,
            'longitud'  : longitud,
            'categoria' : categoria,
            'servicios_repetidos' : servicios_repetidos,
            'unit'      : 'km',
            'radius'    : 15
        },      
         
        success: function( data, textStatus, jqXHR ) { // Si todo salio bien se ejecuta esto
            
            console.log(data);
            console.log(textStatus);
            console.log(jqXHR);
            
            var servicios = [];
            var precio;
            var moneda;
            var url_imangen;
            var html_marker;
            
            
            
            jQuery.each( data, function( id_servicio, info_servicio ) { ... ...});
     } ... ...
     ...
 }) ...
   } ...

来自 DATA 的 LOG 显示按 KEY VALUE 排序的对象,而不是之前发送的自定义顺序。

如果我检查来自jqXHR.responseText 的日志,它具有我想要的正确顺序,所以基本上可以正常接收数据,但有些东西正在改变顺序。

所以,问题是,有谁知道为什么 DATA 是按 KEY VALUE 排序的,我该如何解决这个问题?

(具有正确顺序的 jqXHR 日志 - 按距离)

"{"144":

{"service_ID":"144","distancia":"6.043960511486238"},"110":{"service_ID":"110","distancia":"6.040024571156195"},"112":{"service_ID ":"112","distancia":"6.040024571156195"},"113":{"service_ID":"113","distancia":"6.040024571156195"},"114":{"service_ID":"114", “距离”:“6.040024571156195”},“119”:{“服务ID”:“119”,“距离”:“6.040024571156195”},“145”:{“服务ID”:“145”,“距离”:“6.040024571156195 "},"194":{"service_ID":"194","distancia":"5.025501693483518"},"163":{"service_ID":"163","distancia":"4.985331564912346"},"161" :{"service_ID":"161","distancia":"1.3274942401635288"}}"

(顺序错误的数据日志 - 按密钥 ID)

对象{ 110:对象,112:对象,113:对象,114:对象,119: 对象,144:对象,145:对象,161:对象,163:对象,194: 对象}

谢谢

【问题讨论】:

  • 如果你能详细展示你的查询构建方法和ajax请求,那么给出解决方案会更容易。谢谢!
  • @AbuMuaz 刚刚使用正在使用的 PHP 和 JQUERY 函数编辑了代码。
  • 你正在修改成功函数内部的数据变量,在 $.each 部分,你能也显示那段代码吗?
  • @ggderas 是的,我也可以添加它,但是顺序不正确的 console.log( DATA ) 出现在 $.each 之前,所以在进入之前不应该是正确的顺序$.each ?
  • @CarlosCarmona 不是真的,数组是对象,因此无论您在哪里打印数组,任何更改都将引用同一个变量。

标签: arrays json ajax wordpress sorting


【解决方案1】:

不确定是否是最好的解决方案,但我设法通过将 OBJECT 转换为数组然后对数组进行排序来使其工作。

基本上我添加了这段代码:

/* ********************** */
// ordeno por distancia
/* ********************** */
var arr = jQuery.map(data, function(value, key){
    return value
});

function SortByName(a, b){
    var aName = a.distancia;
    var bName = b.distancia; 

    return ((aName > bName) ? -1 : ((aName < bName) ? 1 : 0));
}

arr.sort(SortByName);
/* ********************** */

就在jQuery.each( arr , function( id_servicio, info_servicio ) { ... ...});函数之前

【讨论】:

    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多