web-dev-qa-db-ja.com

プラグインのオプションにアクセスするために必要な機能をどのように変更できますか?

私は次の3つの異なる役割を持っています:AdminEditor、そしてSEO。私はYoastによってWordPress SEOをインストールしました、そして、私はこれを手に入れたいです:

  • 編集者にSEOオプションを見せたくない、彼らは投稿を書くだけでSEOについては知りません。最適化を行うSEOロールを持つ人がいます。
  • SEOの人に他のプラグインのオプションを見せたくない。編集者と同じ機能を持ちたいが、SEO機能は有効にしている。

このサイトのスニペットをいくつか試してみたところ、meta boxEditorsに隠すことができましたが、Publishボタンの上の小さな 'rating box'

また、2番目のポイントの扱い方もわかりません。すべてのプラグインが同じmanage_options機能を使用しているため、その機能をSEOロールに割り当てることはできません。そして、プラグインファイルを変更せずに必要な機能を変更する方法がわかりません _(プラグインのアップデートで失われるもの)。

前もって感謝します。

5
EliasNS

たぶんこれは設定とオプションへのアクセスを編集者に与えるのでそれが最善の方法ではありませんが、これがすることはオプションを編集するための特定の編集者(ユーザーIDに基づく)を与えることです。次に、私たちがoptionsテンプレートの1つをロードしているかどうかをテストします。そうであり、かつユーザーIDが許可を与えたのと同じIDである場合は、プロセスを終了してメッセージを吐き出します。

1) まず最初に、あなたのSEOユーザーを作成し、彼に編集者の役割を割り当てます。

2) 次に、このユーザーにmanage_optionsの機能を付与する必要があります。これを見つけるには、ユーザーを編集してURLを見ます。URLの最後のパラメータの1つになります。

/** Give our SEO Guy Permissions **/
function give_seo_yoastToast() {
    $user = new WP_User( $seo_user_id );
    $user->add_cap( 'manage_options');
}
add_action( 'admin_init', 'give_seo_yoastToast');

3) 今、すべてのSEO dudeskiが重要なオプションにアクセスできないことを確認する必要があります。私の知る限りでは、以下のページはこのユーザーが重要な情報を編集できる唯一の方法です。これらのページを閲覧した場合、私たちはそれを殺してメッセージを吐き出します。メッセージを自由に変更してください。

/** Remove Access to Certain Pages **/
add_action( 'load-options-general.php', 'prevent_seoguy_access' );
add_action( 'load-options-writing.php', 'prevent_seoguy_access' );
add_action( 'load-options-reading.php', 'prevent_seoguy_access' );
add_action( 'load-options-discussion.php', 'prevent_seoguy_access' );
add_action( 'load-options-media.php', 'prevent_seoguy_access' );
add_action( 'load-options-permalink.php', 'prevent_seoguy_access' );
add_action( 'load-options.php', 'prevent_seoguy_access' );
function prevent_seoguy_access(){
    $currID = is_user_logged_in() ? get_current_user_id() : 0;

    if($currID == $seo_user_id ){
        wp_die("There was a hole here once, it's gone now.");
        exit();
    }
}

4) 今、彼はメニューでページを見ることができます、しかし、彼がそれらにアクセスするとき、彼は上のメッセージを見ます。追加のステップとして、このページをメニューから実際に削除しましょう。上記の機能を使用せずにメニューページを削除すると、経験豊富なユーザはURLから直接任意のオプションページに移動する可能性があります。

/** Remove Settings Menu Page from SEO Guy **/
function seo_guy_menu() {
    if(!current_user_can('administrator')){
        remove_menu_page('options-general.php');
    }
}
add_action('admin_menu', 'seo_guy_menu');

5) これでおしまいです。

あなたがあなたの質問で指摘したように残念なことに、Yoastはそれらに不必要な余分な許可を与えずにユーザーに特定の許可を与える能力を持っているように見えません。そして別の注意点として、静的な$seo_user_idを使う代わりにSEOロールを作る代わりに、上記のロールエディタにパーミッションを与えることもできます。これはもう少し手間がかかりますが(あまり多くはありませんが)、SEOを一人でやっている人が1人しかいない場合は、上記の方法で問題ありません。

4
Howdy_McGee

ユーザーがYoast SEO設定ページを表示するために必要な機能を変更する最善の方法は、wpseo_manage_options_capabilityフィルタを使用することです。

これがどのように使用されるかの例です(あなたのfunctions.phpファイルに置かれる):

/**
 * Return the capability that users need to view the Yoast SEO settings pages.
 *
 * @return mixed|void
 */
function my_custom_wpseo_manage_options_capability() {

    $manage_options_cap = 'edit_others_posts';

    return $manage_options_cap;
}
add_filter( 'wpseo_manage_options_capability', 'my_custom_wpseo_manage_options_capability' );

上記の例では、(デフォルトのWordPressインストールで)EditorsとAdminsの両方がYoast SEO設定にアクセスできるようにedit_others_posts機能が使用されています。

あなたが「普通の」編集者にアクセス権を与えたくない場合は、編集者と同じ機能を持つ新しいロール(すなわち「SEO」)と、追加のカスタム機能(つまりmanage_wpseo_options)を作成する必要があります上記の関数でedit_others_postsの代わりに使用できます。

Membersプラグイン Justin Tadlockによる/あなたは簡単にこれのための新しい役割と能力を作成することを可能にします。

注: この問題のため でMultisiteでは動作しないかもしれません/ /。


更新: Yoast SEO v5.5以降では、wpseo_manage_options_capabilityフィルタはwpseo_manage_optionsに改名されました。

4
Matt Sims

非常に単純な解決策を見つけました。まだ行っていない場合は、何らかの形式の機能マネージャプラグインをインストールしてください。次に、機能マネージャ内から新しい機能を作成します。それを「CUSTOM_CAPABILITY_NAME」またはそれ以外の名前にします。次に、それを特定の役割またはユーザーに割り当てます。

重要 :コピーしてバックアップし、あなたがf * ckアップした場合に修正しようとしているファイル、あなたはいつでもオリジナルを復元することができます。

次に、実際のサーバー上でディレクトリをwp-content/plugins /に変更してからgrepし、 'manage_options'を持つすべてのファイルを見つける必要があります。

例:grep 'manage_options' */*

ややこしい部分は、ダッシュボードにメニューやサブメニューを追加するメイン機能を見つけることです。これが、Yoast SEO固有のアクセスに関する2つの例です。

$manage_options_cap = apply_filters( 'wpseo_manage_options_capability', 'CUSTOM_CAPABILITY_NAME' );


add_submenu_page( 'wpseo_dashboard', __( 'WooCommerce SEO Settings', 'yoast-woo-seo' ), __( 'WooCommerce SEO', 'yoast-woo-seo' ), 'CUSTOM_CAPABILITY_NAME', $this->short_name, array(

シモンズ - '$'で始まるものは何も変更しないでください - それは変数です。 :)

1
Fabian