在编辑器中为帖子和页面的内容添加登录墙复选框的小功能

问题描述

我有一个客户要求他们只能将帖子和页面中的内容限制为登录用户。通常,我会使用页面模板来完成此操作,其中内容围绕 is_user_logged_in() 条件,但在这种情况下,由于其他原因,已经有页面模板在使用。所以我选择尝试通过一个独立于主题插件一个简单的小解决方案来完成它。我发现了一些其他插件可以做同样的事情,但对于我的需求来说太复杂了。

我希望能够审查我提出的解决方案,因为虽然它确实按预期工作,但我想确保它是最有效的,更重要的是尽可能安全。最终结果是一个简单的复选框添加页面编辑器中的发布元框中,将值保存到发布元数据中,如果选中该框,它将过滤 the_contentthe_title删除和替换为登录表单。下面的代码自定义编写、Google 搜索和找到的代码段的组合):

add_action('post_submitBox_misc_actions','drick_create_login_wall_option');
add_action('save_post','drick_save_login_wall_option');

// Create checkBox option to appear on the publish window of the post/page editor
function drick_create_login_wall_option()
{
    $post_id = get_the_ID();
  
    $value = get_post_meta($post_id,'_drick_login_wall_option',true);
    wp_nonce_field('drick_loginwall_custom_nonce_'.$post_id,'drick_loginwall_custom_nonce');
    ?>
    <div class="drick-login-option-wrapper">
        <label>
            <input type="checkBox" value="1" <?PHP checked($value,true,true); ?> name="_drick_login_wall_option" />Make this content login-only?
        </label>
    </div>
    <?PHP
}

// save checkBox option
function drick_save_login_wall_option($post_id)
{
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    
    if (
        !isset($_POST['drick_loginwall_custom_nonce']) ||
        !wp_verify_nonce($_POST['drick_loginwall_custom_nonce'],'drick_loginwall_custom_nonce_'.$post_id)
    ) {
        return;
    }
    
    if (!current_user_can('edit_post',$post_id)) {
        return;
    }
    if (isset($_POST['_drick_login_wall_option'])) {
        update_post_Meta($post_id,$_POST['_drick_login_wall_option']);
    } else {
        delete_post_Meta($post_id,'_drick_login_wall_option');
    }
}

//hide content based on login status and login-wall option value
add_action( 'loop_start','drick_restricted_content_check' );
function drick_restricted_content_check($query) {
    $login_option = get_post_meta( get_the_ID(),true );
    if( $query->is_main_query() ) {
        if( $login_option == '1' && !is_user_logged_in() ) {
            add_filter( 'the_content','drick_replace_content' );
            add_filter( 'the_title','drick_replace_title' );
            function drick_replace_content() {
                $result = '<div class="drick-login-form">';
                $result .= '<h3>This content is for logged-in users only</h3>';
                $result .= wp_login_form(array('echo' => false));
                $result .= '</div>';
                $result .= '<!-- This is put in place via the_content filter in drick plugin -->';
                return $result;
            }
            function drick_replace_title() {
                return;
            }
        }
    }
}

我确实认识到使用 Genesis Framework 挂钩会更容易,但正如我之前所说,我希望它与主题无关,以防我可以将它用于我管理的其他站点。我很想听到一些关于是否有更有效和/或更安全的方法来实现相同目标的建设性反馈。也许以后我会在代码添加用户角色限制,但现在它只是简单的复选框。提前致谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)