非常有趣的问题。这有点超出了典型转鼓/能力功能的范围,因为它更细粒度(除非我错了——很可能)。
第一步是以某种方式分配用户可以编辑的帖子。
粘贴用户的个人资料页面最有意义。这样你就可以edit_user_profile
, 获取网站上的所有页面,并将其粘贴在多选框中。代码注释应该一步一步地解释一下。edit_user_profile
仅在编辑其他用户的配置文件时显示。
<?php
add_action( \'edit_user_profile\', \'wpse30211_user_profile\' );
function wpse30211_user_profile( $user )
{
// only show this on editor pages
if( ! in_array( \'editor\', $user->roles ) ) return;
// get the pages.
$pages = get_posts(
array(
\'post_type\' => \'page\',
\'numberposts\' => -1,
\'post_status\' => \'any\',
)
);
// Bail if we don\'t have pages.
if( ! $pages ) return;
// Which pages can our user edit?
$allowed = get_user_meta( $user->ID, \'wpse30211_pages\', true );
if( ! is_array( $allowed ) || empty( $allowed ) ) $allowed = array();
// nonce-i-fy things
wp_nonce_field( \'wpse30211_nonce\', \'wpse30211_nonce\' );
// section heading...
echo \'<h3>\' . __( \'Grant this User permission to edit...\' ) . \'</h3>\';
echo \'<select multiple="multiple" name="wpse30211[]">\';
echo \'<option value="0">None</option>\';
foreach( $pages as $p )
{
// for use in checked() later...
$selected = in_array( $p->ID, $allowed ) ? \'on\' : \'off\';
echo \'<option \' . selected( \'on\', $selected, false ) . \' value="\' . esc_attr( $p->ID ) . \'">\' . esc_html( $p->post_title ) . \'</option>\';
}
echo \'</select>\';
}
接下来,您需要保存添加到人员配置文件中的额外数据。要做到这一点,你必须
edit_user_profile_update
. 验证上述函数中的nonce设置,然后检查
wpse30211
字段已设置并使用
update_user_meta
.
<?php
add_action( \'edit_user_profile_update\', \'wpse30211_user_save\' );
function wpse30211_user_save( $user_id )
{
// verify our nonce
if( ! isset( $_POST[\'wpse30211_nonce\'] ) || ! wp_verify_nonce( $_POST[\'wpse30211_nonce\'], \'wpse30211_nonce\' ) )
return;
// make sure our fields are set
if( ! isset( $_POST[\'wpse30211\'] ) )
return;
$save = array();
foreach( $_POST[\'wpse30211\'] as $p )
{
$save[] = $p;
}
update_user_meta( $user_id, \'wpse30211_pages\', $save );
}
现在有趣的部分是:禁止访问某些页面。要做到这一点,你可以
load-post.php
, 什么时候开火
wp-admin/post.php
, 加载后期编辑屏幕。抓取正在编辑的帖子id,检查以确保它是一个页面。然后,使用
wp_get_current_user
并获取允许编辑的页面
get_user_meta
. 如果当前帖子ID不在允许编辑的页面数组中,请调用
wp_die
并删除页面。
<?php
add_action( \'load-post.php\', \'wpse30211_kill_edit\' );
function wpse30211_kill_edit()
{
$post_id = isset( $_REQUEST[\'post\'] ) ? absint( $_REQUEST[\'post\'] ) : 0;
if( ! $post_id ) return;
// bail if this isn\'t a page
if( \'page\' !== get_post_type( $post_id ) ) return;
$user = wp_get_current_user();
$allowed = get_user_meta( $user->ID, \'wpse30211_pages\', true );
if( ! is_array( $allowed ) || empty( $allowed ) ) $allowed = array();
// if the user can\'t edit this page, stop the loading...
if( ! in_array( $post_id, $allowed ) )
{
wp_die(
__( \'User cannot edit this page\' ),
__( "You can\'t edit this post" ),
array( \'response\' => 403 )
);
}
}
最后,你可以
pre_update_post
并阻止用户无法编辑页面的更新。
<?php
add_action( \'pre_post_update\', \'wpse30211_stop_update\' );
function wpse30211_stop_update( $post_id )
{
// not a page? bail.
if( \'page\' !== get_post_type( $post_id ) ) return;
$user = wp_get_current_user();
$allowed = get_user_meta( $user->ID, \'wpse30211_pages\', true );
if( ! is_array( $allowed ) || empty( $allowed ) ) $allowed = array();
if( ! in_array( $post_id, $allowed ) )
{
wp_die(
__( \'User cannot edit this page\' ),
__( "You can\'t edit this post" ),
array( \'response\' => 403 )
);
}
}
上述方法可行,但我怀疑有一种方法可以更轻松地使用WP的内置角色&;能力。事情是这样的
as a plugin.