通过add_filter将参数传递给函数

时间:2017-10-12 10:33:43

标签: php wordpress wordpress-theming

我正在尝试构建基于半径的位置搜索,以返回我所拥有的各种CPT的相关帖子。整个过程是有效的,但我有一个问题将一些参数传递给我的functions.php文件中的函数(我从表单中获取它们但不知道如何将它们传递给函数)。

参数是lat lng和radius(目前手动写入我的functions.php中的代码)。

的search.php

<?php
    // Get objects from search form
    if($_GET['spot_name'] && !empty($_GET['spot_name']))
    {
        $spot_name = $_GET['spot_name'];
    }
    if($_GET['spot_type'] && !empty($_GET['spot_type']))
    {
        $spot_type = $_GET['spot_type'];
    }
    if($_GET['lat'] && !empty($_GET['lat']))
    {
        $spot_lat = $_GET['lat'];
    }
    if($_GET['lng'] && !empty($_GET['lng']))
    {
        $spot_lng = $_GET['lng'];
    }
    if($_GET['radius'] && !empty($_GET['radius']))
    {
        $spot_radius = $_GET['radius'];
    }

    // Declare the query arguments
    $args = array(
        'post_type' => $spot_type,
        'post_title' => $spot_name
    );

    // Add our filter before executing the query
    add_filter( 'posts_where' , 'location_posts_where' );

    // Execute the query
    $location_query = new WP_Query( $args );

    // Remove the filter just to be sure its
    // not used again by non-related queries
    remove_filter( 'posts_where' , 'location_posts_where' );

    // The Loop
    if ( $location_query->have_posts() ) {
        echo '<ul>';
        while ( $location_query->have_posts() ) {
            $location_query->the_post();
            echo '<li>' . get_the_title() . '</li>';
            the_field('mp_spot_loc_lat');
        }
        echo '</ul>';
        /* Restore original Post Data */
        wp_reset_postdata();
    } else {
        // no posts found
    }

    ?>

的functions.php

function location_posts_where( $where )
{
    global $wpdb;

    $lat = '41.834536';
    $lng = '39.2440537479998';

    $radius = 60;

    $where .= " AND $wpdb->posts.ID IN (SELECT post_id FROM wp_lat_lng_post WHERE
         ( 3959 * acos( cos( radians(" . $lat . ") )
                        * cos( radians( lat ) )
                        * cos( radians( lng )
                        - radians(" . $lng . ") )
                        + sin( radians(" . $lat . ") )
                        * sin( radians( lat ) ) ) ) <= " . $radius . ")";

    return $where;
}

1 个答案:

答案 0 :(得分:0)

问题在于应用和删除过滤器的步骤。

wpdb过滤器仅在查询开始后自行应用,并且我已经过早删除它。在查询结束后将其移动到解决了问题。

现在,我可以将参数作为全局变量传递,并使搜索半径和高度变为动态。

global $spot_lat;
global $spot_lng;
global $spot_radius;