วิธีเพิ่มการแจ้งเตือนของผู้ดูแลระบบเมื่อทำการบันทึก / อัพเดท


16

ฉันมีประเภทโพสต์ที่ใช้ post_save เพื่อนำที่อยู่จากโพสต์เมตาและดึงพิกัดละติจูด / ลองจิจูดจาก Google API ฉันต้องการวิธีแจ้งให้ผู้ใช้ทราบหากมีปัญหาในการเรียก coordintes ฉันพยายามใช้ admin_notices แต่ไม่มีสิ่งใดปรากฏขึ้น:

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

ฉันไม่แน่ใจว่าฉันใช้มันไม่ถูกต้องหรือในบริบทที่ผิด เพื่อความชัดเจนในรหัสจริง add_action อยู่ในฟังก์ชั่นอื่นในชั้นเรียนเดียวกัน มันใช้งานได้ดี


ฉันได้พัฒนาสคริปต์ที่ช่วยให้คุณเพิ่มการแจ้งเตือนผู้ดูแลระบบที่เลิกจ้าง / คงที่ได้อย่างง่ายดายgithub.com/askupasoftware/wp-admin-notification
Yoav Kadosh

คำตอบ:


30

สาเหตุที่ใช้งานไม่ได้เนื่องจากมีการเปลี่ยนเส้นทางเกิดขึ้นหลังจากการกระทำ save_post วิธีหนึ่งที่คุณสามารถบรรลุความต้องการของคุณได้ก็คือการใช้งานแบบสอบถามด่วน

นี่คือคลาสตัวอย่างเพื่อแสดง:

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

หวังว่านี่จะช่วยคุณได้เล็กน้อย ไชโย


ใช้งานได้ดีขอบคุณ! แต่มีวงเล็บปิดที่ขาดหายไปในบรรทัดแรกในpublic function admin_notices()(วงเล็บปิดพิเศษในif ( ! isset(..บรรทัด)
Rhys Wynne

ฉันเพิ่มremove_query_arg('YOUR_QUERY_VAR');เมื่อฉันพบว่ามันสามารถตั้งค่าได้จากการปรับปรุงล่าสุด
Tony O'Hagan

+1 คำตอบที่ดี
ทำเครื่องหมาย

12

ทำคลาส wrapper สำหรับสถานการณ์ประเภทนี้ จริงๆแล้วคลาสสามารถใช้ในสถานการณ์ใด ๆ ที่เกี่ยวข้องกับการแสดงประกาศ ฉันใช้มาตรฐาน PSR ดังนั้นการตั้งชื่อจึงผิดปกติของรหัส Wordpress

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

การใช้งาน:

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

การแจ้งเตือนจะปรากฏขึ้นหนึ่งครั้ง


6

นอกจากคำตอบของ @ jonathanbardo ซึ่งยอดเยี่ยมและทำงานได้ดีหากคุณต้องการลบอาร์กิวเมนต์การสืบค้นหลังจากโหลดหน้าใหม่แล้วคุณสามารถใช้ตัวกรองแบบถอดได้ คุณได้รับอาร์เรย์ของชื่ออาร์กิวเมนต์ที่คุณสามารถต่อท้ายอาร์กิวเมนต์ของคุณเอง จากนั้น WP จะดูแลการลบอาร์กิวเมนต์ทั้งหมดในรายการออกจาก URL

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

สิ่งที่ต้องการ:

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

จะกลายเป็น:

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

1

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

การใช้

ในตัวจัดการคำขอโพสต์ของคุณ:

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

ตำแหน่งที่คุณต้องการใช้การแจ้งเตือนของผู้ดูแลระบบมักจะอยู่ในadmin_noticesตะขอ

$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>';
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.