पोस्ट सेव / अपडेट पर एडमिन नोटिस कैसे जोड़ें


16

मेरे पास पोस्ट-मेटा से एड्रेस लेने के लिए पोस्ट टाइप का उपयोग करता है और Google API से lat / lng निर्देशांक पुनर्प्राप्त करता है। मुझे उपयोगकर्ता को सूचित करने का एक तरीका चाहिए, अगर समन्वय को पुनः प्राप्त करने के साथ कोई समस्या थी। मैंने 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');जैसा कि मैंने पाया है कि इसे अंतिम अपडेट से सेट किया जा सकता है।
टोनी ओ'हागन

+1 अच्छा जवाब।
मार्क

12

इस तरह के परिदृश्य के लिए एक आवरण वर्ग बनाया। वास्तव में कक्षा का उपयोग किसी भी परिदृश्य में किया जा सकता है जिसमें सूचनाएँ प्रदर्शित होती हैं। मैं PSR मानकों का उपयोग करता हूं, इसलिए नामकरण वर्डप्रेस कोड का atypical है।

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>';
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.