มีตัวกรอง / ฮุกสำหรับการตรวจสอบความถูกต้องของฟิลด์ที่กำหนดเองก่อนเผยแพร่โพสต์หรือไม่?


11

xxxx_urlฉันได้เองยื่นเรียกว่า xxxx_urlควรจะไม่ซ้ำกัน

ดังนั้นก่อนที่จะโพสต์โพสต์ฉันต้องการตรวจสอบให้แน่ใจว่าxxxx_urlมันไม่ซ้ำกันหรือไม่? หากไม่ซ้ำกันการโพสต์ควรถูกปฏิเสธ

ฉันพยายามpublish_postแล้ว แต่นั่นไม่ใช่สิ่งที่ถูกต้องเนื่องจากมันจะทริกเกอร์เมื่อเราเผยแพร่โพสต์ ฉันต้องการเรียกใช้รหัสของฉันก่อนการเผยแพร่


1
ทำไมไม่ตั้งค่ารหัสการโพสต์ปัจจุบันเป็นค่าที่ไม่ซ้ำ ที่ชอบ: 132_urlที่132เป็นรหัสการโพสต์ กว่าคุณจะมีคุณค่าที่นี่เสมอ นอกจากนั้นควรบันทึกฟิลด์ที่กำหนดเองในการsave_postดำเนินการ ในการดำเนินการนี้คุณสามารถตรวจสอบฟิลด์ที่กำหนดเอง (ถ้ามันไม่ว่างเปล่าและมีค่าที่ไม่ซ้ำกัน) และขึ้นอยู่กับสิ่งนี้update_post_metaหรือไม่ ผมคิดว่าคุณยังสามารถตรวจสอบข้อมูลที่กำหนดเองและถ้ามันไม่มีคุณค่าที่ไม่ซ้ำกันตั้งpost-statusไปdraftหรือสิ่งอื่นที่จะปิดการใช้งานการเผยแพร่ มิฉะนั้นฉันคิดว่าคุณต้องการ jQuery เพื่อทำสิ่งนี้
LWS-Mo

คำตอบ:


5

ในตอนต้นของwp_insert_postฟังก์ชั่นที่ช่วยปรับปรุง / wp_insert_post_empty_contentโพสต์มีตัวกรองที่เรียกว่า ตามค่าเริ่มต้นตัวกรองนี้จะตรวจสอบว่าฟิลด์ชื่อตัวแก้ไขและข้อความที่ตัดตอนมาทั้งหมดว่างเปล่าหรือไม่ซึ่งในกรณีนี้กระบวนการบันทึกจะหยุดลง

อย่างไรก็ตามเนื่องจากฟิลด์ทั้งหมดที่จะบันทึกถูกส่งผ่านไปยังตัวกรองนี้คุณสามารถขยายตัวกรองนี้เพื่อรวมการทดสอบอื่น ๆ เพื่อพิจารณาว่าการโพสต์ควรจะถือว่าว่างเปล่าหรือไม่ มันจะเป็นอะไรเช่นนี้:

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

หมายเหตุ: ฟังก์ชั่นจะต้องส่งกลับ 'true' เพื่อหยุดกระบวนการบันทึก

หากฟิลด์ที่กำหนดเองไม่ซ้ำกันคุณอาจต้องการสะท้อนคำเตือน


2
สิ่งนี้อาจใช้งานได้ แต่ดูเหมือนแฮ็คมากกว่าการแก้ปัญหา ผมเคยคิดว่าเรื่องนี้เป็นอย่างดี แต่ต่อมาก็ตัดสินใจที่จะไม่โพสต์ในฐานะwp_insert_post_empty_contentที่มีความหมายความหมายสำหรับเนื้อหาที่ว่างเปล่า ต้องบอกว่าฉันไม่พบเบ็ดใด ๆ ที่ถูกต้องสำหรับความหมายนี้
สกอตต์

ถ้าเป็นเพียงชื่อและเนื้อหาที่ว่างเปล่าจะไม่มีตัวกรองสำหรับนักพัฒนา
cjbj

1
หากคุณมุ่งเน้นที่คำว่า "ว่างเปล่า" น้อยลงฉันจะบอกว่าตัวกรองนี้มีวัตถุประสงค์เพื่อตรวจสอบว่าโพสต์นั้นตรงตามข้อกำหนดขั้นต่ำสำหรับการบันทึกหรือไม่ OP ต้องการขยายข้อกำหนดขั้นต่ำ บางทีตัวกรองควรถูกตั้งชื่อwp_insert_post_valid_contentเพื่อแสดงว่า แต่สำหรับส่วนที่เหลือมันอยู่ในตำแหน่งที่ถูกต้อง
cjbj

@cjbj เมื่อคุณมีคำถามเช่นนี้คุณจะพบตัวกรองที่ถูกต้องได้อย่างไร ฉันหมายถึงคุณพบwp_insert_post_empty_contentตัวกรองได้อย่างไร
ฉันเป็นคนที่โง่ที่สุดใน

1
เมื่อคุณทำงานกับ WP มาระยะหนึ่งคุณก็รู้ว่าส่วนใดของรหัสที่จะสร้างส่วนของผู้ดูแลระบบ ดังนั้นคุณค้นหาไฟล์และตรวจสอบซอร์สโค้ดสำหรับตัวกรองที่มีอยู่
cjbj

1

วิธีการเกี่ยวกับการใช้ AJAX เพื่อตรวจสอบความเป็นเอกลักษณ์ก่อนที่จะส่งโพสต์เพื่อเผยแพร่?

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

แม้ว่ารหัสจะไม่ถูกทดสอบ แต่ควรใช้งานได้ คุณอาจต้องเล่นกับมันเพื่อให้ได้ผลลัพธ์ที่คุณต้องการ


0

ฉันขอเชื่อมต่อกับตัวกรองwp_insert_post_dataและจัดการสิ่งนี้ให้น้อยที่สุดเท่าที่จะทำได้เพราะฉันเข้าใจว่าคุณไม่ต้องการบล็อกการแทรกโพสต์คุณเพียงต้องการหลีกเลี่ยงการเผยแพร่โพสต์ด้วยค่าเมตาซ้ำกัน

ฉันไม่สามารถสำรองมากเกินไปในกรณีนี้เพราะคุณไม่ได้ใช้รหัสใด ๆ แต่นี่เป็นรหัสหลอกของตัวกรองที่ใช้งานได้:

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

อีกสิ่งที่ยอดเยี่ยมเกี่ยวกับตัวกรองนี้คือมันถูกแยกออกจากสิ่งที่แนบมาwp_insert_attachment_dataด้วย

ฉันหวังว่ามันจะช่วยและสิ่งที่คุณทำมันฟังดูน่ากลัว!


2
นั่นอาจไม่ใช่ความคิดที่ดี เกิดอะไรขึ้นถ้า$data['post_status']เป็นpublishผู้ใช้และมีการปรับปรุงมันได้หรือไม่ จะไม่ได้ทำโพสต์เป็นdraftสร้าง404ปัญหาสำหรับการโพสต์ที่?
สกอตต์

@Scott กล่าวอีกนัยหนึ่งหากโพสต์ที่เผยแพร่ตรวจพบในบันทึกว่าค่าเมตาของมันไม่ซ้ำกันการประกาศโพสต์ควรถูกปฏิเสธและโพสต์ควรเป็นแบบร่าง อีกครั้งฉันไม่ทราบว่าค่าเมตามีความสำคัญเพียงใด แต่ถ้าเป็นการเรียงลำดับข้อมูลหรือสิ่งที่จำเป็นสถานะโพสต์ควรเป็นแบบร่าง (ซึ่งไม่ได้หมายความว่ามีปัญหา 404 แสดงว่าโพสต์นั้นได้รับ ออกจากมุมมองสาธารณะ)
Andrei

-1

wp_insert_postการตรวจสอบควรจะไป เบ็ดนี้ถูกไล่ออกทุกครั้งที่มีการเผยแพร่หรือแก้ไขโพสต์

คุณสามารถทำแบบสอบถามที่กำหนดเองเพื่อตรวจสอบว่ามีการโพสต์ใดมีxxxx_urlค่าเดียวกันหรือไม่

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
เท่าที่ฉันรู้สิ่งที่คุณเขียนไว้ข้างในถ้าโพสต์คำสั่ง / else จะถูกเผยแพร่ตั้งแต่การwp_insert_postกระทำเริ่มขึ้นเมื่อโพสต์ได้รับการบันทึกแล้วจะไม่สามารถปิดกั้นการเผยแพร่หรือการแทรกโพสต์
ฉันเป็นคนที่โง่ที่สุดใน

ดังนั้นคุณต้องการที่จะบล็อกการเผยแพร่ถ้าโพสต์ล้มเหลวในการตรวจสอบ? คุณไม่ได้เขียนว่าในคำถามของคุณ
Petr Cibulka

ฉันได้กล่าวไว้อย่างชัดเจนว่าIf it isn't unique it should reject publishing post.ในคำถามของฉัน
ฉันเป็นคนที่โง่ที่สุดใน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.