Hata / uyarı mesajlarını bir meta kutudan “admin_notices” a aktarma


20

Post özel alanları (kullanarak update_post_meta()) güncelleyen basit bir meta kutusu var .

Kullanıcı yayını yayınladıktan / güncelledikten ve meta kutu alanlarından birini doldurmadıktan (veya bunları geçersiz verilerle doldurduktan) sonra bir sonraki sayfaya nasıl hata veya uyarı mesajı gönderebilirim?

Yanıtlar:


9

Bunu elle yapabilirsiniz, ancak WP ayar hataları için yerel olarak bunu yapar:

  1. add_settings_error() mesaj oluşturmak için.
  2. Sonra set_transient('settings_errors', get_settings_errors(), 30);
  3. settings_errors()içinde admin_noticesekrana kanca (non-ayarlarla ekranlar için kanca gerekir).

istediğim şeyi yapıyor, ama bu veritabanını ton geçici ile doldurmaz mı?
onetrickpony

@ Yerel işlem geçişindeki bir Trick Pony açıkça silinir ( get_settings_errors()kaynağa bakın ). Ayarlar dışı sayfa için mantığı uyarlarsanız bunu kendiniz yapmanız gerekebilir.
Rarst

2
hala db geçici hata mesajları depolama fikrini sevmiyorum. Kullanıcıyı giriş değişikliği konusunda uyarmak için ajax kullanacağım
onetrickpony

Nesne önbelleğe almada veritabanı dağınıklığı sorun olmaz.
lkraav

15

admin_noticeskanca kullanabilirsiniz

önce bildirim işlevini tanımlayın:

function my_admin_notice(){
    //print the message
    echo '<div id="message">
       <p>metabox as errors on save message here!!!</p>
    </div>';
    //make sure to remove notice after its displayed so its only displayed when needed.
    remove_action('admin_notices', 'my_admin_notice');
}

Gerektiğinde metabox kaydetme işlevini ekleyin:

...
...
if($errors){
    add_action('admin_notices', 'my_admin_notice');
}
...
...

Güncelleştirme

Burada söz verdiğim gibi, meta kutumdan nasıl bir hata mesajı eklediğime bir örnek

<?php
/*
Plugin Name: one-trick-pony-notice
Plugin URI: http://en.bainternet.info
Description: Just to proof a point using admin notice form metabox
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/

/*  admin notice */
function my_admin_notice(){
    //print the message
    global $post;
    $notice = get_option('otp_notice');
    if (empty($notice)) return '';
    foreach($notice as $pid => $m){
        if ($post->ID == $pid ){
            echo '<div id="message" class="error"><p>'.$m.'</p></div>';
            //make sure to remove notice after its displayed so its only displayed when needed.
            unset($notice[$pid]);
            update_option('otp_notice',$notice);
            break;
        }
    }
}

//hooks

add_action('add_meta_boxes', 'OT_mt_add');
add_action('save_post', 'OT_mt_save');
add_action('admin_notices', 'my_admin_notice',0);

//add metabox
function OT_mt_add() {
    add_meta_box('OT_mt_sectionid', __( 'One Trick Meta Box notice', 'textdomain' ),'OT_mt_display','post');
}

//display metabox
function OT_mt_display() {

  // Use nonce for verification
  wp_nonce_field( plugin_basename(__FILE__), 'myplugin_noncename' );

  // The actual fields for data entry
  echo '<label for="myplugin_new_field">';
       _e("leave blank to get a notice on publish or update", 'textdomain' );
  echo '</label> ';
  echo '<input type="text" id="ot_field" name="ot_field" value="" size="25" />';

}


//save metabox here is were i check the fields and if empty i display a message
function OT_mt_save( $post_id ) {

  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times
    if (!isset($_POST['myplugin_noncename'])) return $post_id;
  if ( !wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename(__FILE__) ) )
      return $post_id;

  // verify if this is an auto save routine. 
  // If it is our form has not been submitted, so we dont want to do anything
  if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
      return $post_id;


  if(!isset($_POST['ot_field']) || empty($_POST['ot_field'])){
    //field left empty so we add a notice
    $notice = get_option('otp_notice');
    $notice[$post_id] = "You have left the field empty";
    update_option('otp_notice',$notice);
  }

}

Şimdi bu kodu ararken post_updated_messagesben de ekleyeceğim böylece aynı şekilde filtre kanca kullanarak yapmak benim eski yolunu buldum :

<?php
/*
Plugin Name: one-trick-pony-notice2
Plugin URI: http://en.bainternet.info
Description: just like the one above but this time using post_updated_messages hook
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/

//hooks
add_filter('post_updated_messages','my_messages',0);
add_action('add_meta_boxes', 'OT_mt_add');
add_action('save_post', 'OT_mt_save');


//add metabox
function OT_mt_add() {
    add_meta_box('OT_mt_sectionid', __( 'One Trick Meta Box notice', 'textdomain' ),'OT_mt_display','post');
}

//display metabox
function OT_mt_display() {

  // Use nonce for verification
  wp_nonce_field( plugin_basename(__FILE__), 'myplugin_noncename' );

  // The actual fields for data entry
  echo '<label for="myplugin_new_field">';
       _e("leave blank to get a notice on publish or update", 'textdomain' );
  echo '</label> ';
  echo '<input type="text" id="ot_field" name="ot_field" value="" size="25" />';

}


//save metabox here is were i check the fields and if empty i display a message
function OT_mt_save( $post_id ) {

  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times
    if (!isset($_POST['myplugin_noncename'])) return $post_id;
  if ( !wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename(__FILE__) ) )
      return $post_id;

  // verify if this is an auto save routine. 
  // If it is our form has not been submitted, so we dont want to do anything
  if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
      return $post_id;


  if(!isset($_POST['ot_field']) || empty($_POST['ot_field'])){
    //field left empty so we add a notice
    $notice = get_option('otp_notice');
    $notice[$post_id] = "You have left the field empty";
    update_option('otp_notice',$notice);
  }

}

//messages filter
function my_messages($m){
    global $post;
    $notice = get_option('otp_notice');
    if (empty($notice)) return $m;
    foreach($notice as $pid => $mm){
        if ($post->ID == $pid ){
            foreach ($m['post'] as $i => $message){
                $m['post'][$i] = $message.'<p>'.$mm.'</p>';

            }
            unset($notice[$pid]);
            update_option('otp_notice',$notice);
            break;
        }
    }
    return $m;
}

gerçekten işe yaramaz, çünkü
gönderiyi

1
Nereye yönlendirildiniz? Ve yukarıdaki kod ne işe yaradığını biliyorum wha.
Bainternet

metabox kaydetme fonksiyonunuz bağlı save_postmı?
onetrickpony

1
teşekkürler, ancak bu Rarst işaretiyle aynı şeyi yapar: hata mesajı db'ye kaydedilir ve daha sonra alınır ve sonraki sayfada silinir.
onetrickpony

1
DB kullanmak için -1. Doğru kullanıcının hatayı göreceğini garanti edemezsiniz. Ayrıca, gereksiz yükü değmez. Metabox hatalarını işlemek için net bir kesme yöntemine sahip olmamanız için, bu güzel bir çalışmadır, ancak yine de verimli değildir. Başkalarına yardım etmek için bunu yeni bir yanıtla yapma şeklimize bir örnek ekledim.
Jeremy

11

WP Tavern'de Otto'dan gelen bu cevap [ ayna ] aslında geçici sorunu, WordPress'in yönlendirme probleminin üstesinden gelmek için yaptığı şeyi yaparak çözüyor. Tamamen benim için çalıştı.

Sorun şu ki, geçici olanlar herkes için var. Aynı anda birden fazla kullanıcı varsa, hata mesajı yanlış kişiye gidebilir. Bu bir yarış koşulu.

WordPress aslında bunu URL'ye bir mesaj parametresi ileterek yapar. Mesaj numarası, hangi mesajın görüntüleneceğini gösterir.

redirect_post_locationFiltreyi asarak add_query_argve isteğe kendi parametrenizi eklemek için kullanarak da aynısını yapabilirsiniz . Şöyle ki:

add_filter('redirect_post_location','my_message');
function my_message($loc) {
 return add_query_arg( 'my_message', 123, $loc );
}

Bu my_message=123sorguya ekler . Ardından, yeniden yönlendirmeden sonra, içindeki my_message ayarını algılayabilir $_GETve uygun mesajı buna göre görüntüleyebilirsiniz.


3

Bu sorunun eski olduğunu biliyorum, ancak sorunu çözmek için burada cevaplar buluyorum.

Ana Ban'ın cevabını genişleterek, Otto'nun yöntemini kullanarak , bunu hataları ele almak için en iyi yöntem olarak buldum. Bu, hataların db'ye kaydedilmesini gerektirmez.

Kullandığım bir Metabox nesnesinin soyulmuş bir sürümünü ekledim. Bu, kolayca yeni hata mesajları eklememe ve doğru kullanıcının hata mesajını görmesini sağlama (db kullanarak, bu bir garanti değildir).

<?php
/**
 * Class MetaboxExample
 */
class MetaboxExample {

    /**
     * Defines the whitelist for allowed screens (post_types)
     */
    private $_allowedScreens = array( 'SCREENS_TO_ALLOW_METABOX' );

    /**
     * Get parameter for the error box error code
     */
    const GET_METABOX_ERROR_PARAM = 'meta-error';

    /**
     * Defines admin hooks
     */
    public function __construct() {
        add_action('add_meta_boxes', array($this, 'addMetabox'), 50);
        add_action('save_post', array($this, 'saveMetabox'), 50);
        add_action('edit_form_top', array($this, 'adminNotices')); // NOTE: admin_notices doesn't position this right on custom post type pages, haven't testes this on POST or PAGE but I don't see this an issue
    }

    /**
     * Adds the metabox to specified post types
     */
    public function addMetabox() {
        foreach ( $this->_allowedScreens as $screen ) {
            add_meta_box(
                'PLUGIN_METABOX',
                __( 'TITLE', 'text_domain' ),
                array($this, 'metaBox'),
                $screen,
                'side',
                'high'
            );
        }
    }

    /**
     * Output metabox content
     * @param $post
     */
    public function metaBox($post) {
        // Add an nonce field so we can check for it later.
        wp_nonce_field( 'metaboxnonce', 'metaboxnonce' );
        // Load meta data for this metabox
        $someValue = get_post_meta( $post->ID, 'META_KEY_IDENTIFIER', true );
        ?>
        <p>
            <label for="some-value" style="width: 120px; display: inline-block;">
                <?php _e( 'Some Field:', 'text_domain' ); ?>
            </label>
            &nbsp;
            <input type="text" id="some-value" name="some_value" value="<?php esc_attr_e( $someValue ); ?>" size="25" />
        </p>
    <?php
    }

    /**
     * Save method for the metabox
     * @param $post_id
     */
    public function saveMetabox($post_id) {
        global $wpdb;

        // Check if our nonce is set.
        if ( ! isset( $_POST['metaboxnonce'] ) ) {
            return $post_id;
        }
        // Verify that the nonce is valid.
        if ( ! wp_verify_nonce( $_POST['metaboxnonce'], 'metaboxnonce' ) ) {
            return $post_id;
        }
        // If this is an autosave, our form has not been submitted, so we don't want to do anything.
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
            return $post_id;
        }
        // Check the user's permissions.
        if ( isset( $_POST['post_type'] ) && 'page' == $_POST['post_type'] ) {
            if ( ! current_user_can( 'edit_page', $post_id ) ) {
                return $post_id;
            }
        } else {
            if ( ! current_user_can( 'edit_post', $post_id ) ) {
                return $post_id;
            }
        }
        // Make sure that it is set.
        if ( !isset( $_POST['some_value'] ) ) {
            return $post_id;
        }
        // Sanitize user input.
        $someValue = sanitize_text_field( $_POST['some_value'] );
        // Check to make sure there is a value
        if (empty($someValue)) {
            // Add our error code
            add_filter('redirect_post_location', function($loc) {
                return add_query_arg( self::GET_METABOX_ERROR_PARAM, 1, $loc );
            });
            return $post_id; // make sure to return so we don't allow further processing
        }
        // Update the meta field in the database.
        update_post_meta( $post_id, 'META_KEY_IDENTIFIER', $someValue );
    }

    /**
     * Metabox admin notices
     */
    public function adminNotices() {
        if (isset($_GET[self::GET_METABOX_ERROR_PARAM])) {
            $screen = get_current_screen();
            // Make sure we are in the proper post type
            if (in_array($screen->post_type, $this->_allowedScreens)) {
                $errorCode = (int) $_GET[self::GET_METABOX_ERROR_PARAM];
                switch($errorCode) {
                    case 1:
                        $this->_showAdminNotice( __('Some error happened', 'text_domain') );
                        break;
                    // More error codes go here for outputting errors
                }
            }
        }
    }

    /**
     * Shows the admin notice for the metabox
     * @param $message
     * @param string $type
     */
    private function _showAdminNotice($message, $type='error') {
        ?>
        <div class="<?php esc_attr_e($type); ?> below-h2">
            <p><?php echo $message; ?></p>
        </div>
    <?php
    }

}

Bu cevapla ilgili tek sorun PHP 5.2 ile çalışmıyor olmasıdır. Hepimizin HPP 5.2'yi desteklememiz gerektiğini söylemiyorum, ancak WordPress'in minimum gereksinimi olarak PHP 5.2 olana kadar eklentiyi
dağıtırsak

1
Anonim işlevi kaldırır ve genel bir yöntem yaparsanız, düzgün çalışması gerekir. Sorununuzu anlıyorum ama kişisel olarak PHP'nin EOL sürümü için gelişmeyeceğim ( php.net/eol.php ) 5.2 EOL 6 Ocak 2011 idi. WordPress, EOL sürümlerini desteklememek için daha fazla çaba sarf etmelidir, ancak bu başka bir hikaye artı hala EOL sürümleri sağlayan birçok kötü hosting şirketi ...
Jeremy
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.