为每个角色或自定义仪表板自定义wp_欢迎面板

时间:2013-10-22 作者:Cerere

我很想用自定义图标、快捷方式、指南等来定制和简化我的仪表板。我已经可以使用小部件来完成这项工作了,但我想做得更好。

wp\\U welcome\\u在这方面的面板非常棒:我可以定制它,我可以让它显示我想要的任何东西,但是。。。只有管理员才能看到这一点。所以我想知道:

1) 我是否可以自定义wp\\U welcome\\u面板,以便每个角色都可以看到它?

2) 我是否可以在小部件之前添加一些代码,以便创建类似于wp\\u welcome\\u panel中的自定义仪表板标题)?我已经试过了

function mycustomcontent() {
    echo \'<h1>Hello world</h1>\';
}
add_action(\'load-index.php\', \'mycustomcontent\');
但是。。。HTML输出放在任何内容之前(就在body标记之后),甚至按下侧边栏。

提前感谢

2 个回复
最合适的回答,由SO网友:kaiser 整理而成

“欢迎小组”在哪里

Wordpress仪表板(包含“欢迎面板”)基本上是

~/wp-admin/index.php
何时显示正如您在查看source, 有以下检查:

if ( has_action( \'welcome_panel\' ) && current_user_can( \'edit_theme_options\' ) )
如何绕过所需的功能?让它对每个人都可用这意味着最低角色/能力(角色名称也被分配为能力)为edit_theme_options. 现在,正如OlegButuzov在他的回答中所显示的那样,您可以将回调挂接到user_has_cap 过滤器或内部过滤器get_user_meta() - 内部有一个过滤器get_metadata() - 已命名

apply_filters( "get_{$meta_type}_metadata", null, $object_id, $meta_key, $single );
现在回调如下所示。确保挂钩尽可能靠近欢迎面板动作。\'all_admin_notices\' 非常适合。

确保仅在仪表板上触发此筛选器回调,并且仅触发一次。否则,您会给用户提供不需要的功能,导致用户可以访问您的实际主题设置。我用了WCM Current Admin Info plugin 检索该数据。

// Hooking as late as possible
add_action( \'all_admin_notices\', \'wpse119694AddCapCheckOverride\' );
function wpse119694AddCapCheckOverride()
{
    // Do some check against get_current_screen()
    if ( \'dashboard\' !== get_current_screen()->id )
        add_filter( \'get_user_metadata\', \'wpse119694AddEditThemeOptionsCap\', 20, 4 );
}

// The callback used to override the cap check
function wpse119694AddEditThemeOptionsCap( $return, $objectId, $metaKey, $single )
{
    // Instantly remove to avoid conflicts later on
    remove_filter( current_filter(), __FUNCTION__ );

    // Only for the current user
    if ( wp_get_current_user()->user_id !== $objectId )
        return $return;

    // Only for the \'edit_theme_options\' cap
    if ( \'edit_theme_options\' === $metaKey )
        return TRUE;

    return $return;
}
附加:始终显示欢迎面板用户可以关闭欢迎面板。有时我们不希望这样,因为我们假设他们没有阅读我们的重要信息/笔记或出于任何原因。注意:你需要把你自己内部化。

add_action( \'all_admin_notices\', \'wpse119694AddCapCheckOverride\' );
function wpse119694AddCapCheckOverride()
{
    // Do some check against get_current_screen()
    if ( \'dashboard\' !== get_current_screen()->id )
        add_filter( \'get_user_metadata\', \'wpse119694ShowWelcomePanel\', 20, 4 );
}

function wpse119694ShowWelcomePanel( $return, $objectId, $metaKey, $single )
{
    // Instantly remove to avoid conflicts later on
    remove_filter( current_filter(), __FUNCTION__ );

    // Only for the current user
    if ( wp_get_current_user()->user_id !== $objectId )
        return $return;

    // ALWAYS show the welcome panel
    if ( \'show_welcome_panel\' === $metaKey )
    {
        // Implement additional checks in here
        return TRUE;
    }

    return $return;
}
“欢迎面板”的自定义内容现在我们需要做的第一件事就是去掉原始内容。然后,我们可以根据用户ID/名称/角色等添加自定义内容wp_get_current_user(), 返回的实例WP_User 装满了我们需要的所有数据。

// Hook as close to the welcome panel as possible
add_action( \'welcome_panel\', \'wpse119684WelcomePanelContents\' );
function wpse119684WelcomePanelContents()
{
    remove_all_actions( current_filter() );

    $userData = wp_get_current_user();

    $html = <<<EOF
<!-- custom HTML -->
EOF;

    // Here you start overriding the previous $html based on user capabilities.
    if ( \'some-check-against\' === $userData )
        $html = <<<EOF
<!-- custom HTML for a specific Role/User/etc.
EOF;

    return $html;
}
现在,您应该能够为每个用户/角色/功能自定义“欢迎面板”的每一部分。

参考标记

为用户编写自己的“欢迎面板”内容的一个很好的参考是cores defaultwp_welcome_panel() 作用

<div class="welcome-panel-content">

    <h3><?php _e( \'Headline\', \'your_textdomain\' ); ?></h3>

    <p class="about-description"><?php _e( \'Intro\', your_textdomain\' ); ?></p>

    <div class="welcome-panel-column-container">

        <div class="welcome-panel-column">
             <h4><?php _e( \'Sub Headline\', your_textdomain\' ); ?></h4>
             <a class="button button-primary button-hero hide-if-customize" href="<?php echo get_edit_user_link(); ?>">
                 <?php _e( \'Want to complete your profile? :)\', \'your_textdomain\' ); ?>
             </a>
        </div>

        <div class="welcome-panel-column">
            <?php /* Some more content in another column */ ?>
        </div>

        <div class="welcome-panel-column welcome-panel-last">
            <?php /* The last column */ ?>
        </div>

    </div>

</div>

SO网友:Oleg Butuzov

有两种方法可以做到这一点。

您可以(a)从edit_theme_optionsread 在wp源代码中。或(c)动态更改(覆盖)wp管理/索引的功能。php用于任何用户类型。。。

 add_filter(\'user_has_cap\', \'se_119694_user_has_cap\');
 function se_119694_user_has_cap($capabilities){
 global $pagenow;
      if ($pagenow == \'index.php\')
           $capabilities[\'edit_theme_options\'] = 1;
      return $capabilities;
 }
我的建议-不要执行a和/或b。

你在改变核心。这很糟糕在这种情况下,您可以部署面板,只需执行管理页脚操作并使用jQuery将其移动到顶部

add_action(\'admin_footer-index.php\', \'se_119694_admin_footer\');

function se_119694_admin_footer(){
    echo \'<div style="display:none;" class="welcome-panel" id="my_wellcome_panel">Hi!</div>\';
    echo \'
        <script>
            jQuery(window).ready(function(){
                jQuery( "#my_wellcome_panel" ).insertAfter( jQuery( ".wrap h2" ) ).css("display", "block");
            });
        </script>
        \';

}

结束

相关推荐

Hide php Notices in Dashboard

当我编写主题时,我会启用WP-DEBUG。这确保了正确的PHP代码。遗憾的是,大多数插件开发人员一直在使用不存在的变量:echo $args[\'title\']; Notice: Undefined index: title in /wp-content/plugins/easy-fancybox/easy-fancybox.php on line 301 而不是echo ( isset($args[\'title\']) ? $args[\'title\'] : \'\'