2012-03-21 5 views

ответ

25

Для плагин активаций, крюк «admin_notices» не может быть использован непосредственно, потому что есть перенаправление. Обходной путь заключается в том, чтобы сохранить ваше уведомление в таблице опций и проверить его в следующий раз. Кроме того, если вы также хотите охватить обновления плагинов, а также активацию, вам нужно будет использовать другой крючок, такой как «admin_init» (с WP 3.1, см. http://make.wordpress.org/core/2010/10/27/plugin-activation-hooks/).

Вот полный пример плагина, который обрабатывает как активацию, так и обновление. Я сделал отложенное уведомление массивом, чтобы вы могли складывать их.

<?php 
/* 
Plugin Name: My Plugin 
*/ 

register_activation_hook(__FILE__, 'my_plugin_activation'); 
function my_plugin_activation() { 
    $notices= get_option('my_plugin_deferred_admin_notices', array()); 
    $notices[]= "My Plugin: Custom Activation Message"; 
    update_option('my_plugin_deferred_admin_notices', $notices); 
} 

add_action('admin_init', 'my_plugin_admin_init'); 
function my_plugin_admin_init() { 
    $current_version = 1; 
    $version= get_option('my_plugin_version'); 
    if ($version != $current_version) { 
    // Do whatever upgrades needed here. 
    update_option('my_plugin_version', $current_version); 
    $notices= get_option('my_plugin_deferred_admin_notices', array()); 
    $notices[]= "My Plugin: Upgraded version $version to $current_version."; 
    update_option('my_plugin_deferred_admin_notices', $notices); 
    } 
} 

add_action('admin_notices', 'my_plugin_admin_notices'); 
function my_plugin_admin_notices() { 
    if ($notices= get_option('my_plugin_deferred_admin_notices')) { 
    foreach ($notices as $notice) { 
     echo "<div class='updated'><p>$notice</p></div>"; 
    } 
    delete_option('my_plugin_deferred_admin_notices'); 
    } 
} 

register_deactivation_hook(__FILE__, 'my_plugin_deactivation'); 
function my_plugin_deactivation() { 
    delete_option('my_plugin_version'); 
    delete_option('my_plugin_deferred_admin_notices'); 
} 

UPDATE: Там также общий способ использовать set_transient() вместо update_option(), и направлять сообщения на правильный пользователя с правами администратора. Этот пост относится к метабоксам, не плагин активации, но методы работают так же, почти везде в Dashboard, насколько я знаю: https://wordpress.stackexchange.com/questions/15354/passing-error-warning-messages-from-a-meta-box-to-admin-notices

+0

Это выглядит хорошо, моим единственным комментарием было бы СУХОЙ часть, где вы добавляете новое уведомление. – pguardiario

+0

Да, три строки '$ notices = get_option (...); $ замечает [] = ...; update_option (..., $ notices) 'можно абстрагировать до функции my_plugin_add_notice()' общего назначения. Вы часто видите это с параметром «note» против «error».Тогда тогда функция рендеринга отображает ее в стиле WP как синий или красный баннер, используя css-класс «update» или «error», если я правильно помню. – kitchin

3

Просто используйте <div class='updated'>. Например -

echo "<div class='updated'>Test Plugin Notice</div>"; 
+0

да, но тогда это уведомление с указанием всех времен, я хочу, как это уведомление исчезнет, ​​когда я нажимаю на конфигурацию ссылке в этом уведомлении (после активации) – Thompson

+1

В этом случае вам просто нужно добавить флаг, который будет храниться, если пользователь посетил конфигурацию плагина. Вы можете сохранить этот флаг в таблице 'wp_options''. – ronakg

1

Правильный способ добавить свои уведомления, чтобы повторить его в крюке для admin_notices действий:

function wpse8170_admin_notice(){ 
    echo '<div class="updated"><p>This is my notice.</p></div>'; 
} 
add_action('admin_notices', 'wpse8170_admin_notice'); 
+0

Но он не отображается при активации плагина в качестве вопроса. – Progrock

7

Это так просто, чтобы показать уведомление

function your_admin_notice(){ 
echo '<div class="updated"> 
    <p>I am a little yellow notice.</p>  
</div>';  
} 
add_action('admin_notices', 'your_admin_notice'); 

Но если вы хочу показать недопустимое уведомление, а затем попробуйте ниже

add_action('admin_notices', 'example_admin_notice'); 

function example_admin_notice() { 
    global $current_user ; 
     $user_id = $current_user->ID; 
     /* Check that the user hasn't already clicked to ignore the message */ 
    if (! get_user_meta($user_id, 'example_ignore_notice')) { 
     echo '<div class="updated"><p>'; 
     printf(__('This is an annoying nag message. Why do people make these? | <a href="%1$s">Hide Notice</a>'), '?example_nag_ignore=0'); 
     echo "</p></div>"; 
    } 
} 

add_action('admin_init', 'example_nag_ignore'); 

function example_nag_ignore() { 
    global $current_user; 
     $user_id = $current_user->ID; 
     /* If user clicks to ignore the notice, add that to their user meta */ 
     if (isset($_GET['example_nag_ignore']) && '0' == $_GET['example_nag_ignore']) { 
      add_user_meta($user_id, 'example_ignore_notice', 'true', true); 
    } 
} 

И если вы хотите показать это уведомление на определенной странице, попробуйте ниже условия.

function my_admin_notice(){ 
    global $pagenow; 
    if ($pagenow == 'plugins.php') { 
     echo '<div class="updated"> 
      <p>This notice only appears on the plugins page.</p> 
     </div>'; 
    } 
} 
add_action('admin_notices', 'my_admin_notice'); 

You can see here

+0

Я правильно понял, что мне нужно создать функцию обратного вызова для каждого сообщения, которое я хочу отобразить? Как создать функцию, которая принимает параметр, который указывает, что такое сообщение об ошибке? – majikman

+0

Хорошо, если вы хотите отобразить сообщение об ошибке, тогда есть и другой способ. Для отображения admin_notice с параметром вы можете попробовать самый верхний ответ здесь. Также вы можете найти путь по ссылкам ниже: http://stackoverflow.com/questions/1242328/wordpress-displaying-an-error-message-hook-admin-notices-fails-on-wp-insert-p –

0

Я разработал amarkal-admin-notification - скрипт, который позволяет добавлять статические/неотстранимые уведомления администратора и обрабатывает увольнение для вас. Этот скрипт является модулем в рамках Amarkal WordPress.

Например:

amarkal_admin_notification('my-error-notice', __('Oh snap! This is an <strong>error</strong> message.','slug'), 'error'); 
Смежные вопросы