如何在投稿人发帖后12小时禁用编辑发帖选项?

时间:2018-11-22 作者:kacper3355

我试图通过使用多年前的代码片段来实现它,但它似乎不起作用。我需要与古腾堡合作(WP 5.0)。

有可能让它工作吗?

2 个回复
SO网友:Jacob Peattie

其他建议(以及链接中接受的答案)暂时改变了用户的全局功能。那是一种黑客行为。有一个专门为有条件地调整特定内容的功能而设计的挂钩:map_meta_cap.

WordPress检查用户是否可以编辑帖子时,会检查用户是否可以edit_post. WordPress使用map_meta_cap() 作用

例如,当检查用户是否可以编辑帖子时,它会检查帖子是否由当前用户编写。如果是,则映射“元能力”edit_post “基本能力”edit_posts. 如果帖子是其他人写的,它会将其映射到edit_others_posts. 然后检查当前用户是否具有映射的功能。

所以我们可以连接到这个过程中,这样每当WordPress映射edit_post 我们将检查当前用户是否是贡献者,以及帖子是否超过12小时。如果这两件事都是真的,我们将绘制edit_postdo_not_allow, 这意味着不允许用户对其进行编辑:

function wpse_319901_contributor_can_edit( $caps, $cap, $user_id, $args ) {
    // Stop if this isn\'t a check for edit_post or delete_post.
    if ( $cap !== \'edit_post\' || $cap !== \'delete_post\' ) {
        return $caps;
    }

    // Get the current user\'s roles.
    $user  = get_userdata( $user_id );
    $roles = $user->roles;

    // Stop if the user is not a Contributor.
    if ( ! in_array( \'contributor\', $roles ) ) {
        return $caps;
    }

    // For edit_post the post ID will be the first argument in $args.
    $post = get_post( $args[0] );

    // Is the post older than 12 hours?
    if ( get_the_time( \'U\', $post ) < strtotime( \'-12 hours\' ) ) {
        // If so, do not allow the user to edit it.
        $caps[] = \'do_not_allow\';
    }

    return $caps;
}
add_filter( \'map_meta_cap\', \'wpse_319901_contributor_can_edit\', 10, 4 );
您可以阅读有关功能以及元功能如何映射到基本功能的更多信息here.

SO网友:LetTheWritersWrite

How to disable edit post option after period of time?与您指出的解释类似:

最好使用get_post_time() 而是访问全局变量$post->post_date. 这真是一种丑陋而糟糕的做法。默认情况下,它格式化为UNIX EPOCH,但为了安全起见,请传递U参数。

PHP有一个内置函数date(\'U\') 也是在UNIX时代

<?php
function disable_editing_after_twelvehours( $post_object ) {
    $currentTime = date(\'U\');
    $postTime = get_post_time(\'U\',false,$post_object->ID,false);

    $current_user = wp_get_current_user();
    if($current_user->role[\'contributor\']){
        /*Subtract current time from post time and check if it is greater 
        than 
        12hrs(43200 seconds)*/
        if(($currentTime - $postTime) > 43200 {
              $current_user->cap[0] = false;
          }
      }
}
add_action( \'the_post\', \'disable_editing_after_twelvehours\' );
?>
将其挂在立柱上应能检查所有装载的立柱。如果你有问题,请告诉我,因为我在失去思路和忙碌之前写得很快。

结束