Wordpress: bir hata mesajı görüntüleniyor - kanca admin_notices wp_insert_post_data veya publish_post başarısız

3 Cevap php

Sonrası belli bir kategoride ise, bu set edilmesi gereken bazı özel alanları ihtiyacı yüzden doğrulama ekliyorum.

Bu kolay çengel wp_insert_post_data ve admin_notices olmalı, ama admin_notices geri kaybolmasına neden olan bir yönlendirme var.

Tamam - Yani yönlendirme karşısında benim hata mesajını saklamak için oturumu kullanan kesmek oluşturuldu:

function set_post_pending($data, $postarr) {
    // If it's not valid...
        $error = "You are missing some Custom Fields.";
        $_SESSION['admin_notices'] = $error;
        $data['post_status'] = 'pending';
    return $data;
}
add_filter('wp_insert_post_data', 'set_post_pending',1,2);

function session_admin_notice() {
    if($out = $_SESSION['admin_notices']) {
        $_SESSION["admin_notices"] = "";
        echo $out;
    }
    return false;
}
add_action('admin_notices', "session_admin_notice");

Bu çözüm ile sorunu kolay (ama crazy) çözümü vardır ki, session_admin_notice çağrılırken some nasıl oturumu mevcut olmadığıdır:

public static function fix_session_bs() {
    // TODO: Why do I have to do this?
    if(!session_id() && $_COOKIE["PHPSESSID"]) {
        session_start($_COOKIE["PHPSESSID"]);
    }
}
add_action('admin_init', 'fix_session_bs');

Soru: Neden bir hata mesajı atmak için tüm bu delilik geçmesi gerekiyor?

What am I doing wrong?

3 Cevap

Wordpress oturumları kullanmak değildir, ve register_globals üzerine ise $_SESSION dizi silinir.

Wordpress URL bir message tamsayı kullanarak boyunca mesajlardır geçer, iletileri bir dizi daha sonra wp-admin klasöründe ilgili edit-[type]-form.php dosyasında tanımlanır. Ben muhtemelen yönlendirmek için kendi değişken eklemenizi ve daha sonra admin_notices kanca işlevi olduğunu alabilir düşünüyorum. Bu işe nasıl bir fikir almak için edit-[type]-form.php dosyalara bir göz atın.

if($out = $_SESSION['admin_notices']) { 
      $_SESSION["admin_notices"] = ""; 
      echo $out; 
}

O zaman $ _SESSION ['admin_notices'] var sıfırlamak yani bu durum her zaman TRUE

Sadece yapabilirsiniz WordPress gibi yapın: transients Bu gibi kullanıyor:

function set_post_pending($data, $postarr) {
    // If it's not valid...
        $error = "You are missing some Custom Fields.";
        set_transient( get_current_user_id().'missingfield', $error );
        $data['post_status'] = 'pending';
    return $data;
}
add_filter('wp_insert_post_data', 'set_post_pending',1,2);

function show_admin_notice() {
    if($out = get_transient( get_current_user_id().'missingfield' ) ) {
        delete_transient( get_current_user_id().'missingfield' );
        echo "<div class="error"><p>$out</p></div>";
    }
    // return false; // nothing to return here
}
add_action('admin_notices', "session_admin_notice");

* Ps: WordPress $ _SESSION önlemek, thx *