Custom wp_welcome_panel para cada função ou painel customizado

3

Eu adoraria personalizar meu painel com ícones personalizados, atalhos, guias, etc. Eu já posso fazer isso usando widgets, mas gostaria de ousar e fazer algo melhor.

wp_welcome_panel a este respeito, é incrível: eu posso personalizá-lo, eu posso mostrar o que eu quiser, mas ... apenas os administradores podem ver isso. Então eu estava pensando:

1) Posso personalizar o wp_welcome_panel para que cada papel possa realmente vê-lo?

2) Posso adicionar algum código antes dos widgets para criar um cabeçalho de painel personalizado semelhante ao de wp_welcome_panel? Eu já tentei com

function mycustomcontent() {
    echo '<h1>Hello world</h1>';
}
add_action('load-index.php', 'mycustomcontent');

Mas ... a saída HTML é colocada antes de qualquer coisa (logo após a tag body), até mesmo empurrando a barra lateral para baixo.

Obrigado antecipadamente

    
por Cerere 22.10.2013 / 16:57

2 respostas

5

Onde está o "Painel de boas-vindas"?

O painel do Wordpress (que abriga o "Painel de boas-vindas") é basicamente o

~/wp-admin/index.php

Quando aparece?

Como você pode ver ao olhar para a fonte , há as seguintes verifique:

if ( has_action( 'welcome_panel' ) && current_user_can( 'edit_theme_options' ) )

Como contornar a capacidade necessária? Disponibilize para todos!

Isso significa que a função / capacidade mínima (nomes de função também são atribuídos como recursos) é edit_theme_options . Agora você pode, como @OlegButuzov mostrou em sua resposta, ou ligar um retorno de chamada para o filtro user_has_cap , ou o filtro dentro get_user_meta() - acutally um filtro dentro get_metadata() - nomeado

apply_filters( "get_{$meta_type}_metadata", null, $object_id, $meta_key, $single );

Agora, um retorno de chamada seria semelhante ao seguinte. Certifique-se de que o gancho esteja o mais próximo possível da ação do painel de boas-vindas. 'all_admin_notices' seria um bom ajuste.

Certifique-se de acionar esse retorno de chamada somente no painel e apenas uma vez. Senão você daria a um usuário recursos indesejados, resultando em usuários tendo acesso às configurações reais do seu tema. Eu usei o plugin WCM Current Admin Info para recuperar esses dados.

// 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;
}

Adicional: Mostrar sempre o painel de boas-vindas

Os usuários podem dispensar o painel de boas-vindas. Às vezes, não queremos isso, pois assumimos que eles não leram nossas informações / notas importantes ou por qualquer motivo. Nota: você precisará internamente você mesmo.

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;
}

Conteúdo personalizado para o "Painel de boas-vindas"

Agora, a primeira coisa que precisamos fazer é nos livrar do conteúdo original. Em seguida, podemos adicionar nosso conteúdo personalizado com base em um ID / nome / função / etc de usuários. Portanto, utilizamos wp_get_current_user() , que retorna uma instância de WP_User preenchida com todos os dados de que precisamos.

// 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;
}

Agora, você deve poder personalizar cada parte do seu "Painel de boas-vindas" para cada usuário / função / capacidade.

MarkUp de referência

Uma boa referência para começar a codificar seu próprio conteúdo de "Painel de boas-vindas" para seu usuário é o padrão de cores wp_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>
    
por kaiser 22.10.2013 / 17:59
3

Existem duas maneiras de fazer isso.

Você pode (a) Editar o recurso de edit_theme_options para read no código-fonte do wp. ou (c) Alterar (substituir) o recurso em uma mosca para o wp-admin / index.php para qualquer tipo de usuário ...

 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;
 }

Minha recomendação - não faça um e / ou b.

  1. Você está alterando o núcleo. É ruim.
  2. Você está dando permissão (mesmo em homepage do wp-admin) que essa pessoa realmente não precisa. É uma segurança FURO.

Nesse caso, você pode implantar seu painel apenas com a ação admin_footer e usar o jQuery para movê-lo para o topo

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>
        ';

}
    
por Butuzov 22.10.2013 / 17:36

Tags