【问题标题】:WooCommerce: Adding a LEFT JOIN to after woocommerce_get_catalog_ordering_argsWooCommerce:在 woocommerce_get_catalog_ordering_args 之后添加 LEFT JOIN
【发布时间】:2022-01-10 18:25:02
【问题描述】:

我正在尝试按离用户最近的位置排序我的帖子。

为了解决这个问题,我创建了一个名为 geolocation 的表,其中包含所有 latitude(lat) 和 longditude(long) 的 post_id。

为了对帖子进行排序,我使用了以下钩子:woocommerce_get_catalog_ordering_args

我面临的问题是我需要加入我创建的表格,以便我可以按纬度和经度订购产品 (ORDER BY (POW((geodata.long-9.9533548),2) + POW ((geodata.lat-49.7913044),2)) ASC)

使用各种示例,这是我想出的 - 但是我收到 500 内部错误,我不确定如何让连接正常工作,因此我可以按另一个表中的属性排序:

add_filter( 'woocommerce_catalog_orderby', 'add_custom_sorting', 99999);

function add_custom_sorting( $options) {
    
    $options['distance'] = 'Nach Standort sortieren';
    return $options;
}

add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_sorting_for_distance' );

function custom_sorting_for_distance( $args ) {
    
    if ( isset( $_GET['orderby'] ) && 'distance' === $_GET['orderby'] ) {
        add_filter('posts_clauses', 'posts_clauses_add_join_and_filter', 10, 2);
        
        $lat = sanitize_text_field('49.7913044');
        $lng = sanitize_text_field('9.9533548');
        
        $args['order']    = 'ASC';
        $args['meta_key'] = '';
        $args['orderby'] = " (POW((geodata.long-{$lng}),2) + POW((geodata.lat-{$lat}),2)) ";
    }
    
    return $args;
}

function posts_clauses_add_join_and_filter( $clauses, $wp_query ) {
    global $wpdb;
    
    $lat = sanitize_text_field('49.7913044');
    $lng = sanitize_text_field('9.9533548');
    
    $clauses['join'] = " LEFT JOIN 4rqJ9_geodata AS geodata ON 4rqJ9_posts.ID = geodata.post_id  ";
            
    $clauses['orderby'] = " (POW((geodata.long-{$lng}),2) + POW((geodata.lat-{$lat}),2)) ";

    return $clauses;

}

有人知道如何解决这个问题吗?我很确定我只需要正确的方法来加入表格。

这是一个在 PHPmyADMIN 后端运行良好的 SQL 语句,我正在尝试在 WooCommerce 中复制它。

SELECT 4rqJ9_posts.* 
FROM 4rqJ9_posts 
INNER JOIN 4rqJ9_postmeta 
    ON ( 4rqJ9_posts.ID = 4rqJ9_postmeta.post_id ) 
INNER JOIN 4rqJ9_postmeta AS mt1 
    ON ( 4rqJ9_posts.ID = mt1.post_id ) 
INNER JOIN 4rqJ9_postmeta AS mt2 
    ON ( 4rqJ9_posts.ID = mt2.post_id ) 
LEFT JOIN 4rqJ9_geodata AS geodata 
    ON 4rqJ9_posts.ID = geodata.post_id 
WHERE 1=1 
    AND 4rqJ9_posts.post_type = 'product' 
    AND ((4rqJ9_posts.post_status = 'publish')) 
GROUP BY 4rqJ9_posts.ID 
ORDER BY (POW((geodata.long-9.9533548),2) + POW((geodata.lat-49.7913044),2)) ASC

【问题讨论】:

    标签: php wordpress woocommerce location left-join


    【解决方案1】:

    仅供参考,我尝试使用 .= 语句来连接 join 和 orderby 值。我还尝试了一个模拟 where 条件:比如 WHERE 1=1,因为这是最适合我的 SQL 语句:

    SELECT 4rqJ9_posts.* FROM 4rqJ9_posts 
    LEFT JOIN 4rqJ9_geodata AS geodata ON 4rqJ9_posts.ID = geodata.post_id 
    WHERE 1=1 
    ORDER BY (POW((geodata.long-9.9533548),2) + POW((geodata.lat-49.7913044),2)) ASC;
    

    【讨论】:

    • 不确定这是对您问题的回答还是对您问题的补充。是哪一个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2011-11-01
    • 2013-07-02
    相关资源
    最近更新 更多