如何根据Wordpress中的坐标显示用户?

时间:2015-12-10 20:11:11

标签: php mysql wordpress geolocation

在这里,我有一个艰难的: 我有一个运行两个插件的wordpress: - Buddypress - Wordpress精确地理定位(存储数据库中用户的经度,纬度,海拔,位置和ID)。

现在,在我的会员目录页面上,我正在显示该网站的用户。但是,我想向网站的用户展示围绕该页面的用户。

每次我们访问此页面时,为了您的信息,查看器的位置也会被加载并存储在数据库中。

插件存储: - wp_usermeta中的最后位置 - 在wp_options中访问过的所有位置 - 饼干中的当前位置

以下是测试人员数据库中随机位置的值:

a:13:{s:8:"latitude";s:10:"40.6576022";s:9:"longitude";s:18:"-73.58318349999999";s:8:"altitude";s:1:"0";s:8:"accuracy";s:4:"2859";s:16:"altitudeAccuracy";s:1:"0";s:7:"heading";s:3:"NaN";s:5:"speed";s:3:"NaN";s:10:"error_code";s:0:"";s:13:"error_message";s:0:"";s:8:"php_time";i:1449777359;s:8:"php_date";s:19:"2015-12-10 19:55:59";s:15:"php_date_format";s:11:"Y-m-d H:i:s";s:7:"user_id";i:4;}

我希望能够在用户访问页面时显示用户周围的用户。所以基本上: 将位置为100米(半径)的ID显示在ID查看器的ID位置。

但是,我不知道如何在数据库中抓取任何东西。

以下是显示成员的页面代码,通常为:

<?php

/**
 * BuddyPress - Members Loop
 *
 * Querystring is set via AJAX in _inc/ajax.php - bp_legacy_theme_object_filter()
 *
 * @package Boss
 * @subpackage bp-legacy
 */

?>

<?php do_action( 'bp_before_members_loop' ); ?>

<?php if ( bp_has_members( bp_ajax_querystring( 'members' ) ) ) : ?>

    <div id="pag-top" class="pagination">

        <div class="pag-count" id="member-dir-count-top">

            <?php bp_members_pagination_count(); ?>

        </div>

        <div class="pagination-links" id="member-dir-pag-top">

            <?php bp_members_pagination_links(); ?>

        </div>

    </div>

    <?php do_action( 'bp_before_directory_members_list' ); ?>

    <ul id="members-list" class="item-list" role="main">

    <?php while ( bp_members() ) : bp_the_member(); ?>

        <li>
            <div class="item-avatar">
                <a href="<?php bp_member_permalink(); ?>"><?php bp_member_avatar('type=full&width=70&height=70'); ?></a>
            </div>

            <div class="item">
                <div class="item-title">
                    <a href="<?php bp_member_permalink(); ?>"><?php bp_member_name(); ?></a>
                </div>

                <?php
                $showing = null;
                //if bp-followers activated then show it.
                if(function_exists("bp_follow_add_follow_button")) {
                    $showing = "follows";
                    $followers  = bp_follow_total_follow_counts(array("user_id"=>bp_displayed_user_id()));
                } elseif (function_exists("bp_add_friend_button")) {
                    $showing = "friends";
                }

                ?>

                <div class="item-meta">
                    <div class="activity">
                        <?php bp_member_last_active(); ?>
                    </div>

                    <?php if($showing == "friends"): ?>
                    <span class="count"><?php echo friends_get_total_friend_count(bp_get_member_user_id()); ?></span>
                        <?php if ( friends_get_total_friend_count(bp_get_member_user_id()) > 1 ) { ?>
                            <span><?php _e("Friends","boss"); ?></span>
                        <?php } else { ?>
                            <span><?php _e("Friend","boss"); ?></span>
                        <?php } ?>
                    <?php endif; ?>

                    <?php if($showing == "follows"): ?>
                    <span class="count"><?php $followers = bp_follow_total_follow_counts(array("user_id"=>bp_get_member_user_id())); echo $followers["followers"]; ?></span><span><?php _e("Followers","boss"); ?></span>
                    <?php endif; ?>
                </div>

                <div class="item-desc">
                    <p>
                        <?php if ( bp_get_member_latest_update() ) : ?>
                            <?php bp_member_latest_update( array( 'view_link' => true ) ); ?>
                        <?php endif; ?>
                    </p>
                </div>

                <?php do_action( 'bp_directory_members_item' ); ?>

                <?php
                 /***
                  * If you want to show specific profile fields here you can,
                  * but it'll add an extra query for each member in the loop
                  * (only one regardless of the number of fields you show):
                  *
                  * bp_member_profile_data( 'field=the field name' );
                  */
                ?>
            </div>

            <div class="action">
                <div class="action-wrap">
                    <?php do_action( 'bp_directory_members_actions' ); ?>
                </div>
            </div>

            <div class="clear"></div>
        </li>

    <?php endwhile; ?>

    </ul>

    <?php do_action( 'bp_after_directory_members_list' ); ?>

    <?php bp_member_hidden_fields(); ?>

    <div id="pag-bottom" class="pagination">

        <div class="pag-count" id="member-dir-count-bottom">

            <?php bp_members_pagination_count(); ?>

        </div>

        <div class="pagination-links" id="member-dir-pag-bottom">

            <?php bp_members_pagination_links(); ?>

        </div>

    </div>

<?php else: ?>

    <div id="message" class="info">
        <p><?php _e( "Sorry, no members were found.", 'boss' ); ?></p>
    </div>

<?php endif; ?>

<?php do_action( 'bp_after_members_loop' ); ?>

感谢您的帮助!

祝你好运

1 个答案:

答案 0 :(得分:1)

您需要使用this answer

获取坐标并与每位用户进行比较

<?php while ( bp_members() ) : bp_the_member(); ?>替换为:

<?php 
$current_user = wp_get_current_user();
$user_location = get_user_meta($current_user->ID, 'agl_data', true);
$user_lat = floatval($user_location['latitude']); //right now it's a string, you need a float/double.
$user_lng = floatval($user_location['longitude']); //right now it's a string, you need a float/double.
while ( bp_members() ) : bp_the_member();
    $bp_location = get_user_meta(bp_get_member_user_id(), 'agl_data', true);
    $bp_member_lat = floatval($bp_location['latitude']);
    $bp_member_lng = floatval($bp_location['longitude']);

    $distance_in_meters = vincentyGreatCircleDistance($user_lat , $user_lng , $bp_member_lat, $bp_member_lng);
    if($distance_in_meters < 100){
 ?>

然后将您的<?php endwhile; ?>替换为:

<?php } ?>
<?php endwhile; ?>