用于控制对我的站点的某些部分的访问的操作挂钩

时间:2013-03-01 作者:user28249

我正在搜索一个动作挂钩,可以用来控制对Wordpress网站某些部分的访问。我想编写一些自定义PHP,它将检查某些用户属性,并决定他们是否可以查看站点的特定部分(即只有具有特定属性的用户才能查看属于特定url层次结构的页面)。

更具体地说:

我的用户配置文件有两个额外的标志:i)社区1的成员和ii)i)社区2的成员

  • 社区一包含大量内容,这些内容位于带有slug“community1”的页面下。每当用户尝试访问带有slug community1的页面或其任何子页面(例如community1/about)时,我想检查它们是否为a。已登录,b。在其配置文件中设置community1标志。如果他们这样做,那么我允许访问,如果不允许,我将重定向到页面,解释他们需要注册访问

  • 2 个回复
    最合适的回答,由SO网友:diggy 整理而成

    把这个放在最上面page.php 文件,在get_header() 电话:

    <?php
        // redirect if user isn\'t logged in
        if( ! is_user_logged_in() ) {
            wp_safe_redirect( home_url( \'/signup/\' ) );
            exit;
        }
    
        // supply IDs of both parent pages
        $keys = array( \'21\', \'23\' );
    
        // check if user can access page
        foreach( $keys as $key )
        {
            // get parent page object
            $parent = get_page( $key );
    
            // add IDs of parent and children to array
            $pageids = array();
            $objs = get_pages( array( \'child_of\' => $parent->ID ) );
            foreach( $objs as $obj ) $pageids[] = $obj->ID;
            $pageids[] = $key;
    
            if(
                // check if current page is restricted area
                in_array( get_queried_object_id(), $pageids )
                // and check if current user has appropriate meta
                && \'1\' !== get_user_meta( get_current_user_id(), $parent->post_name, true )
            ) {
                // redirect to signup page if conditions aren\'t met
                wp_safe_redirect( home_url( \'/signup/?for=\' . $parent->post_name ) );
                exit;
            }
        }
    ?>
    
    注意:(a)您必须为$keys 第9行的数组,以及(b)此代码期望用户具有具有键的用户元community1 (和/或community2), 和价值1 如果他们有权限。

    SO网友:Milo

    Diggy的答案将为您提供大部分帮助,但是,如果您想在查询数据库和加载模板之前完成所有这些,您可以钩住parse_query 并查看请求的页面:

    function wpa89022_check_user( $query ){
    
        // not a page
        if( ! isset( $query->query[\'pagename\'] ) )
            return;
    
        if( false !== strpos( $query->query[\'pagename\'], \'community1\' ) 
        || false !== strpos( $query->query[\'pagename\'], \'community2\' ) ):
    
            // community1 or community2 is in the requested pagename path
    
        endif;
    
    }
    add_action( \'parse_query\', \'wpa89022_check_user\' );
    

    结束

    相关推荐

    Too many actions/filters!

    这里是wordpress的新成员。动作/过滤器的概念本身并不难理解。令我不知所措的是大量可用的操作和过滤器。当我阅读教程/指南时,他们会说“只需将此功能添加到wp\\U head操作或after\\U setup\\u主题”。如果没有这些教程,我究竟如何知道将该函数与该操作挂钩?作为一个初学者,我怎么会知道什么是合适的操作?有没有关于如何导航的建议?谢谢