内部联接覆盖高级定制字段插件的get_field

时间:2015-07-30 作者:Darius

我用内部连接和where子句进行了这个搜索。我不再获取get\\u field()值,它们都返回false。我怎样才能让ACF再次工作?这一定是我不知道的蠢事。

function get_lat_long($query)
{
    if ( !is_admin() && $query->is_main_query() ) {
        if ($query->is_search) {
        $query->set(\'post_type\', \'doctor\');
        global $wpdb;
            if(isset($_GET[\'zipcode\']) && isset($_GET[\'radius\'])){
                $zipcode = (int)$_GET[\'zipcode\'];
                $radius = (int)$_GET[\'radius\'];

                $lat_long = $wpdb->get_results("SELECT lat, lon FROM zips WHERE zip_code = \'$zipcode\' LIMIT 1");
                if($lat_long):
                    global $minmax;
                    $minmax = bar_get_nearby( $lat_long[0]->lat, $lat_long[0]->lon, 0, $radius );
                    $minLat = $minmax[\'min_latitude\'];
                    $maxLat = $minmax[\'max_latitude\'];
                    $minLon = $minmax[\'min_longitude\'];
                    $maxLon = $minmax[\'max_longitude\'];
                    add_action( \'min_lat\', function(){
                        echo $minLat;
                    });

                    add_filter( \'posts_where\', function( $content ) use ( $minmax ){
                        $where = " AND ( ( (geo.lat BETWEEN \'$minmax[min_latitude]\' AND \'$minmax[max_latitude]\') AND (geo.lng BETWEEN \'$minmax[min_longitude]\' AND \'$minmax[max_longitude]\') )  )";
                        return $where;
                    });

                    add_filter( \'posts_join\', function(){
                        global $wpdb;
                        $join = " INNER JOIN wp_my_geodata AS geo ON ($wpdb->posts.ID = geo.post_id)";
                        return $join;
                    });
                endif;
            }else{
                return;
            }
        }
    }
}

add_filter( \'pre_get_posts\', \'get_lat_long\');
导致问题的部分是

                        add_filter( \'posts_where\', function( $content ) use ( $minmax ){
                            $where = " AND ( ( (geo.lat BETWEEN \'$minmax[min_latitude]\' AND \'$minmax[max_latitude]\') AND (geo.lng BETWEEN \'$minmax[min_longitude]\' AND \'$minmax[max_longitude]\') )  )";
                            return $where;
                        });

                        add_filter( \'posts_join\', function(){
                            global $wpdb;
                            $join = " INNER JOIN wp_my_geodata AS geo ON ($wpdb->posts.ID = geo.post_id)";
                            return $join;
                        });
我得到了正确的结果,只是不能使用get_field(“field_name”);不再

1 个回复
最合适的回答,由SO网友:jonathanbardo 整理而成

不要忘记,当您添加过滤器时,它将保留在那里以供后续所有请求使用。

我建议您移除封盖,然后执行以下操作:

function x_example( $input ) {
  remove_filter( \'posts_where\', \'x_example\' );
  return $input;
}

add_filter( \'posts_where\', \'x_example\' );
您必须对posts\\u join过滤器执行相同的操作。

更新

正如@bonger所指出的,您还可以使用以下方法保持闭包:

$closure = function( $input ) use ( &$closure ) {
   remove_filter( \'posts_where\', $closure );
   return $input;
};

add_filter( \'posts_where\', $closure );

结束