Apakah ada filter tindakan / pengait untuk memvalidasi bidang khusus sebelum menerbitkan posting?

11

Saya memiliki permintaan yang diajukan xxxx_url. xxxx_urlharus unik.

Jadi, sebelum menerbitkan posting, saya ingin memastikan itu xxxx_urlunik atau tidak? Jika tidak unik, mempublikasikan posting harus ditolak.

Saya mencoba publish_post. Tapi itu bukan yang benar, karena dipicu ketika kami mempublikasikan posting. Saya ingin menjalankan kode saya sebelum diterbitkan.

Akulah Orang yang Paling Bodoh
sumber
1
Mengapa tidak menetapkan ID kiriman saat ini sebagai nilai unik. Seperti: di 132_urlmana 132ID pos. Daripada Anda selalu memiliki nilai unik di sini. Selain itu: Bidang khusus harus disimpan dalam save_posttindakan. Dalam tindakan ini Anda dapat memeriksa bidang khusus (jika tidak kosong dan memiliki nilai unik misalnya), dan berdasarkan ini update_post_metaatau tidak. Saya kira Anda juga bisa memeriksa bidang khusus dan jika tidak memiliki nilai unik, setel post-statuske draftatau yang lainnya, untuk menonaktifkan penerbitan. Kalau tidak, saya pikir Anda perlu jQuery untuk melakukan ini.
LWS-Mo

Jawaban:

5

Di awal wp_insert_post, fungsi yang menyimpan / memperbarui posting, ada filter yang disebut wp_insert_post_empty_content. Secara default filter ini memeriksa apakah judul, editor, dan bidang kutipan semuanya kosong, dalam hal ini proses penyimpanan akan dihentikan.

Namun, karena semua bidang yang akan disimpan diteruskan ke filter ini, Anda dapat memperluas filter ini untuk memasukkan tes lain untuk menentukan apakah posting harus dianggap kosong. Itu akan menjadi seperti ini:

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;
  }

Catatan: fungsi harus mengembalikan 'true' untuk menghentikan proses penyimpanan.

Jika bidang khusus tidak unik, Anda mungkin juga ingin mengulangi peringatan.

cjbj
sumber
2
Ini mungkin akan berhasil, tetapi lebih mirip hack, daripada menjadi solusi. Saya telah mempertimbangkan ini juga, tetapi kemudian memutuskan untuk tidak memposting karena wp_insert_post_empty_contentsecara semantik dimaksudkan untuk konten kosong . Karena itu, saya tidak menemukan kait yang semantik tepat untuk ini juga.
Scott
Nah, jika itu hanya untuk judul kosong & konten tidak akan ada filter untuk pengembang.
cjbj
1
Jika Anda kurang fokus pada kata 'kosong', saya akan mengatakan filter ini dimaksudkan untuk memeriksa apakah posting memenuhi persyaratan minimum untuk disimpan. OP ingin memperluas persyaratan minimum. Mungkin filter harus dinamai wp_insert_post_valid_contentuntuk menyatakan itu, tetapi untuk sisanya itu tepat di tempat yang tepat.
cjbj
@ cjbj Ketika Anda memiliki pertanyaan seperti ini, bagaimana Anda menemukan filter yang benar? Maksud saya, bagaimana Anda menemukan wp_insert_post_empty_contentfilter?
Saya Orang yang Paling Bodoh
1
Nah, ketika Anda telah bekerja dengan WP selama beberapa waktu, Anda tahu bagian mana dari kode yang menghasilkan bagian admin mana. Jadi Anda mencari file dan memeriksa kode sumber untuk filter yang tersedia.
cjbj
1

Bagaimana dengan menggunakan AJAX untuk memeriksa keunikan bahkan sebelum mengirimkan posting untuk diterbitkan?

$( '#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' );
    }
  });
});  

Meskipun kode tersebut tidak diuji, tetapi harus berfungsi. Anda mungkin perlu bermain dengannya untuk mendapatkan hasil yang diinginkan.

Abhik
sumber
0

Saya akan menghubungkan ke filter wp_insert_post_data dan menangani ini seminimal mungkin karena karena saya mengerti Anda tidak ingin memblokir penyisipan posting, Anda hanya ingin menghindari menerbitkan posting dengan nilai meta duplikat.

Saya tidak dapat menyimpan terlalu banyak dalam hal ini karena Anda tidak membagikan kode apa pun, tetapi di sini ada beberapa kode pseudo-filter yang berfungsi:

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

Hal hebat lainnya tentang filter ini adalah filter ini terpisah dari lampiran wp_insert_attachment_data.

Saya harap ini membantu, dan apa pun yang Anda lakukan, kedengarannya luar biasa!

Andrei
sumber
2
Itu mungkin bukan ide yang bagus. Bagaimana jika $data['post_status']ini publishdan pengguna memperbarui? Tidak akan membuat pos sebagai draftmembuat 404masalah untuk posting itu?
Scott
@Scott Dengan kata lain, jika posting yang dipublikasikan mendeteksi bahwa nilai meta tidak unik, penerbitan pos harus ditolak, dan pos tersebut harus disusun. Sekali lagi, saya tidak tahu betapa pentingnya nilai meta itu, tetapi jika itu adalah tipe data pengurutan atau sesuatu yang penting, maka status posting harus berupa konsep (yang tidak berarti masalah 404, itu hanya mengatakan bahwa posting telah pensiun dari pandangan publik)
Andrei
-1

Ceknya harus ke wp_insert_post. Pengait ini dipecat setiap kali pos dipublikasikan atau diedit.

Di sana, Anda dapat melakukan kueri khusus untuk memeriksa, apakah ada kiriman yang sudah memiliki nilai yang sama xxxx_urlatau tidak.

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
    }
});
Petr Cibulka
sumber
3
Seperti yang saya tahu, apa pun yang Anda tulis di dalam jika / jika posting pernyataan akan diterbitkan sejak wp_insert_postaksi terpicu setelah posting telah disimpan, itu tidak dapat memblokir penerbitan atau memasukkan posting.
Saya Orang yang Paling Bodoh
Jadi, Anda ingin memblokir penerbitan, jika pos gagal validasi? Anda belum menulis itu dalam pertanyaan Anda.
Petr Cibulka
Saya telah dengan jelas menyebutkan hal itu If it isn't unique it should reject publishing post.dalam pertanyaan saya.
Saya Orang yang Paling Bodoh