web-dev-qa-db-ja.com

編集者ロールがカスタム投稿タイプの設定ページを保存しない

私は現在add_submenu_page経由でサブメニューページを持つカスタム投稿タイプを持っています。このページには、テキストエディタやラジオボタンなどの基本設定を含むフォームがあります。

function programme_enable_pages() {
    add_submenu_page(
        'edit.php?post_type=programmes',
        'content',
        'Archive content',
        'edit_pages',
        basename(__FILE__),
        'archiveContent'
    );
}
add_action( 'admin_menu', 'programme_enable_pages' );

function register_programme_settings() {
    register_setting( 'programme_content', 'programme_content' );
    register_setting( 'programme_content', 'programme_branding' );
}
add_action( 'admin_init', 'register_programme_settings' );

function archiveContent() { ?>
<div class="wrap">

    <form method="post" action="options.php">
        <?php
        settings_fields( 'programme_content' ); 
        do_settings_sections( 'programme_content' );

        wp_editor(
            get_option( 'programme_content' ),
            'programme_content',
            $settings = array(
                'textarea_name' => 'programme_content'
            )
        ); ?>

        <label><b>Branding options</b></label><br>
        <input type="radio" name="programme_branding" id="branding_blue" value="blueBranding" <?php checked('blueBranding', get_option('programme_branding'), true); ?> checked="checked">Blue Branding<br>
        <input type="radio" name="programme_branding" id="branding_red" value="redBranding" <?php checked('redBranding', get_option('programme_branding'), true); ?>/>Red Branding<br>
        <input type="radio" name="programme_branding" id="branding_orange" value="orangeBranding" <?php checked('orangeBranding', get_option('programme_branding'), true); ?>/>Orange Branding

        <?php submit_button(); ?>   
    </form>     
</div>
<?php }

管理者の役割を持つユーザーがコンテンツのいずれかを編集して変更を保存しても、コンテンツは問題なく保存されます。しかし、編集者の役割を持つユーザーが変更を保存すると、次のようなページが表示されます。

申し訳ありませんが、これらのオプションを管理することはできません。

編集者というユーザー役割を持つ人にこれらのオプションを保存させる方法について、正しい方向を教えてください。

2
rikardo85

wp-admin/options.phpファイルには、権限を制御するために設定グループから作成された名前のフィルタがあります。

$capability = apply_filters( "option_page_capability_{$option_page}", $capability );

問題を解決するには、次のような希望の権限レベルでフィルタを追加してください。

add_filter( 'option_page_capability_programme_content', 'my_settings_permissions', 10, 1 );
function my_settings_permissions( $capability ) {
    return 'edit_pages';
}
3
meloniq

オプションを節約するために、ユーザはmanage_options機能を持つ必要があります。

メニューにedit_pages機能を使用すると、管理者ページに編集者がアクセスできるようになりますが、送信を設定すると、管理者ページのコンテキストを考慮していないオプションハンドラコードに移動します。

直し方?管理者以外は誰もサイト全体の設定を変更できないはずなので、あなたのアプローチはただ間違っています...もっと建設的なオプションはsettings APIを使用してフォーム送信を自分で処理すること、またはロールマネージャを使用することではありませんユーザにmanage_option機能を与えるためのプラグインのタイプ。

0
Mark Kaplun