根据用户是否登录更改WordPress中的首页

时间:2013-09-27 15:35:52

标签: php wordpress-plugin wordpress

我正在构建一个插件,帮助用户注册并从WordPress前端登录,并根据用户是否登录隐藏和显示资源。

我坚持的一个方面是如何根据用户的登录/注销状态更改根域中显示的主页。在主题模板中,使用此结构很容易实现:

if ( is_user_logged_in() ) {
    // Logged-in user content
} else {
    // Logged-out user content
}

因为这是一个插件,我不希望网站管理员不得不乱用他们的主题文件。到目前为止,我已尝试将此添加为动态重写首页:

if ( is_user_logged_in() ) {
  $about = get_page_by_title( 'Front Page Logged In' );
  update_option( 'page_on_front', $about->ID );
  update_option( 'show_on_front', 'page' );
} else {
  $about = get_page_by_title( 'Front Page Logged Out' );
  update_option( 'page_on_front', $about->ID );
  update_option( 'show_on_front', 'page' );
}

update_option函数可以自行运行,但是包含在if语句中,会抛出一个致命的错误,因此网站根本不会加载。

我还尝试使用add_rewrite_rule API简单地告诉WordPress将根域视为另一个页面。这在指定特定页面时有效,但我无法弄清楚如何使其适用于根(并且只有根)URL,即使我可以,它也包含在if语句中时也无法正常工作。

function add_my_rule() {
    if ( is_user_logged_in ) {
        add_rewrite_rule('test','index.php?pagename=loggedin','top');
    } else {
      add_rewrite_rule('test','index.php?pagename=loggedout','top');
    }
}
add_action('init', 'add_my_rule');

所以回顾一下,如果用户登录,我需要一种方法来显示一个页面作为首页;如果他们从一个插件(而不是从主题文件)注销,则需要一个不同的页面。任何有关如何使这项工作的见解将非常感谢!

1 个答案:

答案 0 :(得分:1)

方法一

这应该是基于模板文件的技巧。在插件激活时,您仍然需要让用户添加/构建模板或将其复制到主题目录。

add_filter( 'template_include', 'member_home' );
function member_home( $template ) {
    if ( is_home() || is_front_page() ){
        if ( is_user_logged_in() ) {
            return locate_template('home-member.php');
        } else {
            return get_home_template();
        }
    }
    return $template;
}

方法二

这是另一种方法,仅使用插件。这假设您的插件文件夹中有一个templates/目录,其中包含文件member-home.php

它做了两件事:

  • 更改已登录用户的“主页”模板,在活动主题目录中查找该模板,回退到包含插件的版本
  • 用您想要的任何数据替换the_content(在此示例中拉出“Hello World”帖子)

您还可以通过register_activation_hook()添加新页面,并在set_home_content()函数中查询该数据。

define('MYPLUGIN_PLUGIN_PATH', plugin_dir_path( __FILE__ ));
define('ACTIVE_THEME_PATH', get_stylesheet_directory());

add_action('plugins_loaded', 'myplugin_plugins_loaded');

function set_home_template( $template ){
    if ( is_home() || is_front_page() ){
        if ( is_user_logged_in() ){
            if( file_exists(ACTIVE_THEME_PATH.'templates/member-home.php') ) {
                return ACTIVE_THEME_PATH.'templates/member-home.php';
            } else {
                return MYPLUGIN_PLUGIN_PATH.'templates/member-home.php';
            }
        } else {
            return get_home_template();
        }
    }
    // Returns the template
    return $template;
}

function set_home_content( $content ){
    if ( is_home() || is_front_page() ){
        if ( is_user_logged_in() ){
            $args = array(
                'pagename' => 'hello-world',
                'posts_per_page' => 1
            );
            $posts = new WP_Query( $args );
            while ( $posts->have_posts() ) {
                $posts->the_post();
                $content = get_the_content();
            }
            wp_reset_postdata();
            // Returns the custom queried content
            return $content;
        }
    }
    // Returns the default content.
    return $content;
}

function myplugin_plugins_loaded() {
     add_filter( 'template_include', 'set_home_template' );
     add_filter( 'the_content', 'set_home_content', 10 );
}

这应该会给你一些想法,但正如你所说,可能没有真正的“自动”解决方案。用户仍然必须调整主题文件/添加页面或任何其他内容。但这可能是一个伟大的插件文档的一部分;)