按能力查询用户-卸载/停用回调

时间:2013-05-15 作者:kaiser

在MU上运行的情况下,我正在编写一个开源/公开且免费可用的插件。就像我以前一样add_screen_option() 为了让用户能够轻松地根据自己的喜好设置管理页面,我留下了一堆用户元数据。现在,页面本身仅限于具有manage_options 功能,因此只有那些在调整per page 列表表的值。

The "per page" Screen Option

为了让插件保持干净状态,以防有人选择删除插件,我添加了一个停用和一个卸载挂钩回调,该回调应该循环遍历用户数据并删除元条目。现在,我可以简单地遍历所有用户,检查他们的元值等等,但这在有大量用户的网站上几乎不会失败,并以超时结束(记住,元表是JOINed)。

简而言之,我的想法是:MU安装有user 和ausermeta 桌子据我所见,并没有真正保存功能,但角色名称-WordPress在这里对角色和功能没有区别。虽然很有趣,但似乎我必须考虑不同的事情:

User can be…

  • superadmin在多个站点上注册,在多个具有不同角色的站点上注册,在具有相同角色的多个站点上注册,但角色在不同站点上具有不同的功能
问题从这些不同的可能性开始,当您查看存储在网络/MU设置中的功能时,问题会更进一步:

{$wpdb->prefix}capabilities

{$wpdb->prefix}{get_current_blog_id()}_capabilities
那么,一个查询是为了什么?

$query_args = array(
);
$query = new WP_User_Query( $query_args );
$users = $query->results;
if ( empty( $users ) )
    return;

var_dump( $users );
编辑仅是第一次尝试查询具有特定功能的角色名称:

    $roles = new WP_Roles();
    $roles = wp_list_pluck( $roles->role_objects, \'capabilities\' );
    $results = array();
    foreach ( $roles as $role => $caps )
    {
        array_key_exists( \'manage_options\', $caps )
            AND $results[] = $role;
    }
    var_dump( $results );

    # Even if it\'s smarter then above loop, it won\'t work and 
    # throw an error in core files.
    $roles = array_filter( wp_list_pluck( $roles, \'manage_options\' ) );

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

事实上,这比我原先想象的要容易得多——只是做一个WP_User_Query 对于元值(与其他查询类一样,也支持元数组)。

public function on_deactivate()
{
    $meta_key = \'tools_page_tsi_per_page\';
    $query = new WP_User_Query( array( \'meta_key\' => $meta_key ) );

    if ( empty( $query->results ) )
        return;

    foreach ( wp_list_pluck( $query->results, \'ID\' ) as $user_id )
        delete_user_meta( $user_id, $meta_key );
}

结束

相关推荐

WordPress Multisite Dilemma!

过去三年来,我们一直以WordPress安装的形式运行我们的主域,并将子域添加为单独的WordPress安装。随着时间的推移,我们认为将我们的主域作为多站点,并将其他子域作为其子站点进行管理是一个更好的主意。但问题是——它值得吗?链接会发生什么情况?那么三年内建立起来的SEO呢?有什么需要担心的吗?如果你们中的任何人都能回答这个问题,那么要将已经运行的站点移动到多站点界面,需要做些什么?提前非常感谢。