web-dev-qa-db-ja.com

管理領域のカスタム投稿の読み取り専用機能

私は実際にはカスタムタイプをWPに構築しており、投稿アクセスを特定のユーザーロールに制限できるようにする必要があります。管理領域では、共同編集者は投稿を表示できますが編集できません。読み取り専用として開くだけです。私はいくつかのプラグイン(AdminimizeとUser Role Editor)を使いましたが、私の知る限りではそれらは私のニーズには当てはまりません。

これを解決するために私に指示を与える人はいますか?

3
Jackson Gomes

送信メタボックスを削除するというbrasolfiloの提案は、私が完全な解決策を検討する際の一部にすぎません。私はほんの数分で、FireBugまたは他のいくつかのツールのいずれかを使用して、そのページに「送信」ボタンをハッキングすることができます。

私は...するだろう...

  1. メタボックスを削除します。これはbrasofiloのソリューションです、そしてそのコードがうまく見えるので私は詳しく述べません。
  2. 読み取り専用アクセスのみを許可する必要があるユーザーに対して、その投稿タイプのpost-new.phpへのアクセスをすべて削除します。
  3. 編集ページの[新規追加]リンクを変更します。
  4. 投稿された投稿をPHPで終了すると、気が悪くなるのを防ぐことができます(自分のように気にされる)。

次のコードは コーデックスで見つけることができる 'Book'投稿タイプ を使用します。 CPTに合わせて修正できます。

post-new.phpへのアクセスを削除

function conditional_redirect_post_new_wpse_94776() {
  global $_REQUEST,$pagenow;
  if (!empty($_REQUEST['post_type'])
    && 'book' == $_REQUEST['post_type']
    && !empty($pagenow)
    && 'post-new.php' == $pagenow
    && !current_user_can('administrator'))
  {
    wp_safe_redirect(admin_url('edit.php?post_type=book'));
  }
}
add_filter('admin_menu','conditional_redirect_post_new_wpse_94776');

「新規追加」メニューを削除

function remove_add_new_menu_wpse_94776() {
  if (!current_user_can('administrator')) {
    remove_submenu_page('edit.php?post_type=book','post-new.php?post_type=book');
  }
}
add_action('admin_menu','remove_add_new_menu_wpse_94776');

編集ページの[新規追加]リンクを変更します。

function reset_post_new_link_wpse_94776() {
  global $post_new_file,$post_type_object;
  if (!isset($post_type_object) || 'book' != $post_type_object->name) return false;

  if (!current_user_can('administrator')) {
    $post_type_object->labels->add_new = 'Return to Index';
    $post_new_file = admin_url('edit.php?post_type=book');
  }
}
add_action('admin_head','reset_post_new_link_wpse_94776');

卑劣な投稿を防ぐ

function stop_submit_wpse_94776() {
  if (!empty($_POST) && $_POST['post_type'] == 'book' && !current_user_can('administrator')) {
    if (true === DOING_AJAX) {
      exit;
    }
    if (!empty($_POST['post_ID'])) {
      wp_safe_redirect(admin_url('post.php?post='.$_POST['post_ID'].'&action=edit'));
      exit;
    } else {
      wp_safe_redirect(admin_url('edit.php?post_type=book'));
      exit;
    }
  }
}
add_action('admin_init','stop_submit_wpse_94776');

私はそれを持っていると思います。テストしているように動作しますが、特に最後のコードブロックにバグがあっても驚くことではありませんし、同じことをするより洗練された方法があっても驚くことではありません。警告Emptor。返金なし。

5
s_ha_dum

単にメタボックスを削除しただけでは、投稿を保存/更新することはできません。通常のPost投稿タイプでここでテストしました:

add_action( 'do_meta_boxes', 'remove_publish_mbox_wpse_94776', 10, 3 );

function remove_publish_mbox_wpse_94776( $post_type, $position, $post )
{
    remove_meta_box( 'submitdiv', 'post', 'side' );
}

問題 自動保存とリビジョンにあります。

他の解決策はjQueryでフィールドを読み取り専用にすることでしょうが、多分それはそれほど堅実ではありません。

最後に、別のオプションは 削除 TitleとContentフィールドおよび printing 単純なテキストの置き換えです。

2
brasofilo