Kayıt sonrası / güncelleme sonrasında yönetici bildirimi nasıl eklenir?


16

Post-meta adresi almak ve lat / lng koordinatları Google API almak için post_save kullanır bir yazı türü var. Ben koordinatları alma ile ilgili bir sorun varsa kullanıcıyı bilgilendirmek için bir yol gerekir. Admin_notices kullanmayı denedim, ancak hiçbir şey görüntülenmedi:

public static function update_notice() {
  echo "<div class='error'><p>Failed to retrieve coordinates. Please check key and address.<p></div>";
  remove_action('admin_notices', 'update_notice');
}

add_action('admin_notices', array('GeoPost', 'update_notice'));

Yanlış mı yanlış bağlamda mı kullandığımdan emin değilim. Açık olmak gerekirse, gerçek kodda add_action aynı sınıftaki başka bir işlevdedir. Bu iyi çalışıyor.


Yanıtlar:


30

Bunun işe yaramamasının nedeni, save_post eyleminden sonra bir yönlendirme olması. İstediğiniz isteğe erişmenin bir yolu, sorgu değişkenlerini kullanarak hızlı bir çalışma gerçekleştirmektir.

Göstermek için örnek bir sınıf:

class My_Awesome_Plugin {
  public function __construct(){
   add_action( 'save_post', array( $this, 'save_post' ) );
   add_action( 'admin_notices', array( $this, 'admin_notices' ) );
  }

  public function save_post( $post_id, $post, $update ) {
   // Do you stuff here
   // ...

   // Add your query var if the coordinates are not retreive correctly.
   add_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
  }

  public function add_notice_query_var( $location ) {
   remove_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
   return add_query_arg( array( 'YOUR_QUERY_VAR' => 'ID' ), $location );
  }

  public function admin_notices() {
   if ( ! isset( $_GET['YOUR_QUERY_VAR'] ) ) {
     return;
   }
   ?>
   <div class="updated">
      <p><?php esc_html_e( 'YOUR MESSAGE', 'text-domain' ); ?></p>
   </div>
   <?php
  }
}

Umarım bu size biraz yardımcı olur. Şerefe


Harika çalışıyor, teşekkürler! Ancak, ilk satırda eksik bir kapanış braketi var public function admin_notices()( hatta ekstra bir kapanış braketi if ( ! isset(..)
Rhys Wynne

Ben ekledim remove_query_arg('YOUR_QUERY_VAR');ben son güncellemeden itibaren ayarlanabilir bulduğumuz gibi.
Tony O'Hagan

+1 İyi cevap.
Mark

12

Bu tür bir senaryo için bir sarıcı sınıf yaptı. Aslında sınıf, bildirimlerin görüntülenmesini içeren herhangi bir senaryoda kullanılabilir. PSR standartlarını kullanıyorum, bu nedenle adlandırma Wordpress kodunun atipik.

class AdminNotice
{
    const NOTICE_FIELD = 'my_admin_notice_message';

    public function displayAdminNotice()
    {
        $option      = get_option(self::NOTICE_FIELD);
        $message     = isset($option['message']) ? $option['message'] : false;
        $noticeLevel = ! empty($option['notice-level']) ? $option['notice-level'] : 'notice-error';

        if ($message) {
            echo "<div class='notice {$noticeLevel} is-dismissible'><p>{$message}</p></div>";
            delete_option(self::NOTICE_FIELD);
        }
    }

    public static function displayError($message)
    {
        self::updateOption($message, 'notice-error');
    }

    public static function displayWarning($message)
    {
        self::updateOption($message, 'notice-warning');
    }

    public static function displayInfo($message)
    {
        self::updateOption($message, 'notice-info');
    }

    public static function displaySuccess($message)
    {
        self::updateOption($message, 'notice-success');
    }

    protected static function updateOption($message, $noticeLevel) {
        update_option(self::NOTICE_FIELD, [
            'message' => $message,
            'notice-level' => $noticeLevel
        ]);
    }
}

Kullanımı:

add_action('admin_notices', [new AdminNotice(), 'displayAdminNotice']);
AdminNotice::displayError(__('An error occurred, check logs.'));

Bildirim bir kez görüntülenir.


6

@ Jonathanbardo'nun harika ve iyi çalışan cevabına ek olarak, yeni sayfa yüklendikten sonra sorgu bağımsız değişkenini kaldırmak istiyorsanız, removeable_query_args filtresini kullanabilirsiniz . Kendi argümanınızı ekleyebileceğiniz bir dizi argüman adı alırsınız. Ardından WP, listedeki tüm bağımsız değişkenleri URL'den kaldırmaya özen gösterir.

public function __construct() {
    ...
    add_filter('removable_query_args', array($this, 'add_removable_arg'));
}

public function add_removable_arg($args) {
    array_push($args, 'my-query-arg');
    return $args;
}

Gibi bir şey:

'...post.php?post=1&my-query-arg=10'

Olacak:

'...post.php?post=1'

1

Basit, zarif, dayalı get_settings_errors().

function wpse152033_set_admin_notice($id, $message, $status = 'success') {
    set_transient('wpse152033' . '_' . $id, [
        'message' => $message,
        'status' => $status
    ], 30);
}

function wpse152033_get_admin_notice($id) {
    $transient = get_transient( 'wpse152033' . '_' . $id );
    if ( isset( $_GET['settings-updated'] ) && $_GET['settings-updated'] && $transient ) {
        delete_transient( 'wpse152033' . '_' . $id );
    }
    return $transient;
}

kullanım

Posta isteği işleyicinizde:

wpse152033_set_admin_notice(get_current_user_id(), 'Hello world', 'error');
wp_redirect(add_query_arg('settings-updated', 'true',  wp_get_referer()));

Yönetici bildirimini kullanmak istediğiniz yer, genellikle admin_noticeskancada.

$notice = $this->get_admin_notice(get_current_user_id());
if (!empty($notice) && is_array($notice)) {
    $status = array_key_exists('status', $notice) ? $notice['status'] : 'success';
    $message = array_key_exists('message', $notice) ? $notice['message'] : '';
    print '<div class="notice notice-'.$status.' is-dismissible">'.$message.'</div>';
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.