Gönderiyi yayınlamadan önce özel bir alanı doğrulamak için herhangi bir işlem filtresi / kancası var mı?


11

Özel bir dosyalama var xxxx_url. xxxx_urlbenzersiz olmalı.

Peki, yayını yayınlamadan önce, xxxx_urlbunun benzersiz olup olmadığından emin olmak istiyorum ? Benzersiz değilse, yayının yayınlanması reddedilmelidir.

Denedim publish_post. Ancak bu doğru değil, çünkü yayını yayınladığımızda tetikleniyor. Kodumu yayınlamadan hemen önce çalıştırmak istiyorum.


1
Geçerli posta kimliğini neden benzersiz değer olarak ayarlamıyorsunuz? Gibi: posta kimliği 132_urlnerede 132. Burada her zaman benzersiz bir değere sahipsiniz. Bunun yanı sıra: Özel alanlar save_posteylemde saklanmalıdır . Bu eylemde, özel alanı (boş değilse ve örneğin benzersiz bir değere sahipse) kontrol edebilirsiniz ve buna göre update_post_metaveya değil. Ayrıca, özel alanı da kontrol edebilirsiniz ve benzersiz bir değeri yoksa, yayınlamayı devre dışı bırakmak için post-statusolarak draftveya başka bir şey ayarlayın . Aksi takdirde bunu yapmak için jQuery gerekir düşünüyorum.
LWS-Mo

Yanıtlar:


5

Başında, bir gönderiyi wp_insert_postkaydeden / güncelleyen işlev olarak adlandırılan bir filtre vardır wp_insert_post_empty_content. Varsayılan olarak bu filtre başlık, editör ve alıntı alanlarının boş olup olmadığını kontrol eder, bu durumda kaydetme işlemi durdurulur.

Ancak, kaydedilecek tüm alanlar bu filtreye iletildiğinden, postanın boş olarak değerlendirilip değerlendirilmemesi gerektiğini belirlemek için bu filtreyi başka bir test içerecek şekilde genişletebilirsiniz. Böyle bir şey olurdu:

add_filter ('wp_insert_post_empty_content','wpse312975_check_unique_url',10,2);
function wpse312975_check_unique_url ($maybe_empty, $postarr) {

  // extract custom field from $postarr, check uniqueness

  if ($unique) return false else return true;
  }

Not: Kaydetme işlemini durdurmak için işlev 'true' değerini döndürmelidir.

Özel alan benzersiz değilse, bir uyarıyı tekrarlamak isteyebilirsiniz.


2
Bu muhtemelen işe yarayacaktır, ancak bir çözüm olmaktan ziyade bir saldırıya benziyor. Bunu da düşündüm, ancak daha sonra boş içerikwp_insert_post_empty_content için anlamsal olarak yayınlanmamaya karar verdim . Bunu söyledikten sonra, semantik olarak da bunun için doğru olan herhangi bir kanca bulamadım.
Scott

Sadece boş başlık ve içerik için olsaydı, geliştiriciler için bir filtre olmazdı.
cjbj

1
Sadece 'boş' kelimesine daha az odaklanırsanız, bu filtrenin postanın kaydetmek için minimum gereksinimleri karşılayıp karşılamadığını kontrol etmek için olduğunu söyleyebilirim. OP minimum gereksinimleri genişletmek istiyor. Belki de filtre bunu wp_insert_post_valid_contentifade edecek şekilde adlandırılmalıdır , ancak geri kalanı için tam olarak doğru yerdedir.
cjbj

@cjbj Böyle bir sorunuz olduğunda doğru filtreyi nasıl bulursunuz? Demek istediğim, wp_insert_post_empty_contentfiltreyi nasıl buldun ?
Ben En Aptal

1
Bir süre WP ile çalışırken, kodun hangi bölümünün yöneticinin hangi bölümlerini oluşturduğunu bilirsiniz. Böylece dosyayı arar ve kullanılabilir filtreler için kaynak kodunu kontrol edersiniz.
cjbj

1

Gönderiyi yayın için göndermeden önce benzersizliği kontrol etmek için AJAX kullanmaya ne dersiniz?

$( '#post' ).on( 'submit', function( event ) {
  event.preventDefault(); // Prevent publishing

  //Now do some AJAX Checks
  $.post( ajaxurl, data, function(response) {
    if ( response === 'success' ) {
        $( this ).off( event ).submit();
    } else {
        alert( 'The custom field must be unique' );
    }
  });
});  

Kod test edilmemesine rağmen, çalışması gerekir. İstediğiniz sonucu elde etmek için onunla oynamanız gerekebilir.


0

Ben wp_insert_post_data filtre kanca ve bu mümkün olduğunca daha az müdahaleci işlemek çünkü bir yazının eklenmesini engellemek istemiyorum, sadece yinelenen meta değerleri olan bir yazı yayınlamaktan kaçınmak istiyorum çünkü.

Bu durumda çok fazla yedekleyemiyorum çünkü herhangi bir kod paylaşmadınız ama işleyecek bir filtrenin bazı sözde kodu:

function wp8193131_check_if_meta_value_is_unique ( $data, $postarr ) {
    // setup an uniqueness flag.
    $meta_is_unique = true;

    // check if the meta is unique and modify the `$meta_is_unique` flag accordingly.
    // {...} <- your code

    // if the meta is NOT unique keep the post status in draft.
    if ( ! $meta_is_unique ) {
        // you can force the current post to be draft until the meta value will became unique.
        $data['post_status'] = 'draft';
        // maybe, update the meta value with a hint of the fact that it's not unique.
        // or display a dashboard notice about it.
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'wp8193131_check_if_meta_value_is_unique' );

Bu filtre ile ilgili bir başka harika şey de, filtre eklerinden ayrılmasıdır wp_insert_attachment_data.

Umarım yardımcı olur ve ne yaparsanız yapın kulağa harika geliyor!


2
Bu iyi bir fikir olmayabilir. Ya $data['post_status']olduğunu publishve kullanıcı bunu güncelliyor? Gönderiyi bu gönderi draftiçin 404sorun oluşturmaz mı?
Scott

Diğer bir deyişle, yayınlanan bir yayın, meta değerinin benzersiz olmadığını kaydettiğini tespit ederse yayın sonrası reddedilmeli ve yazı taslağı hazırlanmalıdır. Yine, meta değerin ne kadar önemli olduğunu bilmiyorum, ancak bir sıralama veri türü veya önemli bir şeyse, posta durumu taslağı olmalıdır (bu 404 sorunu anlamına gelmez, sadece yazının kamuoyundan emekli oldu)
Andrei

-1

Çek gitmeli wp_insert_post. Bu kanca, yayın her yayınlandığında veya düzenlendiğinde tetiklenir.

Orada, zaten aynı xxxx_urldeğere sahip herhangi bir gönderi olup olmadığını kontrol etmek için özel bir sorgu yapabilirsiniz .

add_action('wp_insert_post', function($post_id) {
    $meta_key = 'xxxx_url';
    $meta_value = get_post_meta($post_id, $meta_key, true);
    $query = new WP_Query([
        'post_type' => get_post_type($post_id),     // This might be unnecessary, if you check `post` post type only. Or use `any`.
        'meta_query' => [
            [
                'meta_key' => $meta_key,
                'meta_value' => $meta_value,
            ]
        ]
    ]);
    if ($query->have_posts()) {
        // invalid key, post with the same value already exists
    } else {
        // valid, key was not found anywhere
    }
});

3
Bildiğim gibi, wp_insert_postbir yazı kaydedildikten sonra eylem tetiklendiğinden , / else deyim yayını yayınlanacaksa ne yazarsanız yayınlayın veya yayın eklemeyi engelleyemez.
Ben En Aptal

Gönderim doğrulamasında başarısız olursa yayınlamayı engellemek mi istiyorsunuz? Bunu aklından geçirmedin 'diye yazdı.
Petr Cibulka

Sorumda bundan açıkça bahsetmiştim If it isn't unique it should reject publishing post..
Ben En Aptal
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.