在UPDATE_OPTION上隐藏管理菜单

时间:2019-01-14 作者:wpdev

我想显示自定义子菜单页,如果get\\u选项为true,则只需隐藏子页。

我的函数必须做到,如果输入值为1,则显示子页,否则隐藏子页。但问题是,当我发布1 value 子菜单不隐藏。我必须刷新页面以隐藏它。

我用这个自定义父页面和子页面。

function create_test_parent() {
    $page_title = __( \'Test Parent Menu\', \'test\' );
    $menu_title = __( \'Test Parent Page\', \'test\' );
    $capability = \'manage_options\';
    $menu_slug = \'test-parent\';
    $function = \'test_parent_display\';
    $icon_url = plugin_dir_url( dirname( __FILE__ ) ) . \'menu_icon.png\';
    $position = 2;

    add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
}

add_action( \'admin_menu\', \'create_test_parent\' );

function create_test_sub() {
    if( !get_option( \'test_option\', true ) )
        return;

    $parent_slug = \'test-parent\';
    $page_title = __( \'Test Sub Menu\', \'test\' );
    $menu_title = __( \'Test Sub Menu\', \'test\' );
    $capability = \'manage_options\';
    $menu_slug = \'test-menu\';
    $function = \'test_sub_display\';

    add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function );
}

add_action( \'admin_menu\', \'create_test_sub\' );
这里是管理显示功能

function test_sub_display() {
    if( isset( $_POST[ \'test\' ] ) ) {
        $value = $_POST[ \'test\' ];

        if( $value == \'1\' ) {
            update_option( \'test_option\', true );
        } else {
            update_option( \'test_option\', false );
        }
    }
    ?>

    <form method="POST">
        <input type="text" name="test">
        <?php submit_button(); ?>
    </form>
    <?php
}

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

好的,那么您将表单放在manu页面回调中,处理该表单的代码也在同一个函数中。

您可以在admin_menu

所有这些都意味着,当您处理表单并更改选项的值时,菜单已经注册。因此,如果不刷新站点,它就不会改变。

要解决这个问题,您必须在注册菜单之前处理表单。

要以尊重最佳实践的方式进行,您还应该使用admin_post_ 钩子来处理表单。它可能看起来像这样:

function test_sub_display() {
    ?>    
    <form method="POST" action="<?php echo esc_attr( admin_url(\'admin-post.php\') ); ?>">
        <input type="hidden" name="action" value="my_test_sub_save" />
        <input type="text" name="test" />
        <?php submit_button(); ?>
    </form>
    <?php
}

function my_test_sub_save_callback() {
    if ( isset( $_POST[ \'test\' ] ) ) {
        $value = $_POST[ \'test\' ];

        if( \'1\' == $value ) {
            update_option( \'test_option\', true );
        } else {
            update_option( \'test_option\', false );
        }
    }

    wp_redirect( \'<URL>\' ); // change <URL> to the URL of your admin page
    exit;
}
add_action( \'admin_post_my_test_sub_save\', \'my_test_sub_save_callback\' );
另外,我不确定这是否是设计的,但您在子菜单页上显示表单,但如果设置了该选项,则不会显示该页,因此如果您隐藏子菜单,则无法更改该选项。