个性化阅读
专注于IT技术分析

通过add_filter将参数传递给函数

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

参数是纬度和半径(当前已手动将其写入我的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


问题出在应用和移除过滤器的步骤中。

wpdb过滤器仅在查询开始后才适用, 而我将其过早删除。将其移至查询结束后即可解决问题。

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

global $spot_lat;
global $spot_lng;
global $spot_radius;
赞(0)
未经允许不得转载:srcmini » 通过add_filter将参数传递给函数

评论 抢沙发

评论前必须登录!