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

Posted

技术标签:

【中文标题】Wordpress中如何根据坐标显示用户?【英文标题】:How to display users according to coordinates in Wordpress? 【发布时间】:2015-12-10 20:11:11 【问题描述】:

在这里,我有一个艰难的: 我有一个运行两个插件的 wordpress: - 伙伴出版社 - Wordpress 精确地理定位(将用户的经度、纬度、高度、位置时间和 id 存储在数据库中)。

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

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

插件商店: - wp_usermeta 中的最后一个位置 - 在 wp_options 中访问的所有位置 - cookie 中的当前位置

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

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;

我希望能够在用户访问页面时显示查看页面的用户周围的用户。所以基本上: 显示位置在距离查看者 ID 位置 100 米(半径)处的 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】:

您需要使用this answer获取他们的坐标并与每个用户进行比较

&lt;?php while ( bp_members() ) : bp_the_member(); ?&gt; 替换为:

<?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)
 ?>

然后将您的&lt;?php endwhile; ?&gt; 替换为:

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

【讨论】:

您好,感谢您的快速答复!我应该在会员页面中复制/粘贴吗? 我刚刚更新了它。您需要将获取用户元键修改为数据库中的内容。然后复制它。显然还添加了我错过的所有 html 所以你想要 if 语句开始的地方,把它放在你之前 &lt;li&gt; 标签 非常感谢,你能告诉我你是如何将它集成到我作为代码发布的页面中的吗?我不知道在 "location_metakey_goes_here" 中放什么?我举了一个例子说明它在数据库中的样子,但也许我不明白!非常感谢您的宝贵时间 再次感谢您的快速回答和出色的解释!我更新了我的文件,到目前为止没有 PHP 错误或其他。但是它没有显示列表中的任何人。我正在测试两个明显出现在同一地址(我的房子)的帐户,也许是因为它不知道哪个表会获取元密钥的信息?你怎么看 ?谢谢!

以上是关于Wordpress中如何根据坐标显示用户?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 在 wordpress 中根据登录用户 = 角色显示内容

根据html中所需的坐标显示图像

如何根据wordpress中的当前帖子自动选择一个值?

在WordPress中根据用户角色显示/隐藏内容

Wordpress 如何根据每个页面上的用户角色应用特定的 CSS 属性

word怎么显示坐标目录?目录大纲(视图 --> 导航窗格)