পোস্ট সেভ / আপডেটের উপরে অ্যাডমিন নোটিশ কীভাবে যুক্ত করবেন


16

পোস্ট-মেটা থেকে ঠিকানা নেওয়ার জন্য এবং গুগল এপিআই থেকে ল্যাড / এলএনজি স্থানাঙ্কগুলি পুনরুদ্ধার করার জন্য আমার পোস্টের একটি পোস্ট রয়েছে যা পোস্ট_সেভ ব্যবহার করে। স্থানাঙ্কগুলি পুনরুদ্ধার করতে সমস্যা দেখা দিলে আমার ব্যবহারকারীকে অবহিত করার একটি উপায় প্রয়োজন। আমি প্রশাসক_নোটিকে ব্যবহার করার চেষ্টা করেছি, তবে কিছুই প্রদর্শিত হয়নি:

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

আমি এটিকে ভুল বা ভুল প্রসঙ্গে ব্যবহার করছি কিনা তা নিশ্চিত নই। পরিষ্কার হয়ে উঠতে, আসল কোডে অ্যাড_অ্যাকশন একই বর্গের অন্য ফাংশনে রয়েছে। এটা ঠিক কাজ করছে।


আমি এমন একটি স্ক্রিপ্ট তৈরি করেছি যা আপনাকে সহজেই খারিজযোগ্য
Yoav Kadosh

উত্তর:


30

কারণ এটি কাজ করে না কারণ সেভ_পোস্ট ক্রিয়াকলাপের পরে পুনর্নির্দেশটি ঘটছে। আপনি যেভাবে চান তা অর্জন করার এক উপায় হ'ল ক্যোয়ারী ওয়ার্স ব্যবহার করে দ্রুত কাজ চালিয়ে যাওয়া।

এখানে প্রদর্শনের জন্য একটি নমুনা শ্রেণি:

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(..) অনুপস্থিত বন্ধনীটি নেই
রাইস ওয়াইন

আমি remove_query_arg('YOUR_QUERY_VAR');হিসাবে খুঁজে পেয়েছি এটি শেষ আপডেট থেকে সেট করা যেতে পারে।
টনি ও'হাগান

+1 ভাল উত্তর।
চিহ্নিত করুন

12

এই জাতীয় দৃশ্যের জন্য একটি মোড়কের ক্লাস তৈরি করুন। প্রকৃতপক্ষে ক্লাসটি নোটিশ প্রদর্শনের সাথে জড়িত যে কোনও পরিস্থিতিতে ব্যবহার করা যেতে পারে। আমি পিএসআর মান ব্যবহার করি, তাই নামকরণটি ওয়ার্ডপ্রেস কোডের মূল বিষয় yp

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

@ জোনাথনবার্ডো এর উত্তর যা দুর্দান্ত এবং কার্যকরভাবে যুক্ত হয়েছে, নতুন পৃষ্ঠাটি লোড হওয়ার পরে আপনি যদি ক্যোয়ারী যুক্তিটি সরাতে চান তবে আপনি অপসারণযোগ্য_কোয়ারি_আরগস ফিল্টারটি ব্যবহার করতে পারেন । আপনি আর্গুমেন্ট নামের একটি অ্যারে পাবেন যাতে আপনি নিজের যুক্তি যুক্ত করতে পারেন। তারপরে ডাব্লুপি ইউআরএল থেকে তালিকার সমস্ত যুক্তি সরিয়ে নেওয়ার যত্ন নেবে।

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.