สร้างฟิลด์ดรอปดาวน์แบบไดนามิกโดยทางโปรแกรมในแบบฟอร์มการติดต่อ 7

ฉันดูไปรอบๆ ที่นี่และจากเครื่องมือค้นหา แต่น่าเสียดายที่ฉันไม่สามารถหาวิธีแก้ปัญหาสำหรับตัวเองได้

ตอนนี้ฉันขอความช่วยเหลือเกี่ยวกับฟังก์ชันที่ฉันต้องปรับแต่งสำหรับปลั๊กอิน WordPress ของ Contact Form 7 ฟังก์ชันนี้มาจากคำถามอื่น

ในเมนูแบบเลื่อนลง (เลือก) ฉันต้องการรายละเอียดสองรายการ (ชื่อเวิร์กช็อปและวันที่) ในฟิลด์ตัวเลือกเดียว รายละเอียดทั้งสองมาจากโพสต์เดียวกันของประเภทโพสต์ที่กำหนดเอง รายละเอียดแรกคือ post_title ส่วนที่สองคือฟิลด์ที่กำหนดเองจากปลั๊กอิน Meta-Box

ฟังก์ชันต่อไปนี้ใช้งานได้ตามหลักการ แต่จะส่งกลับเฉพาะรายละเอียดอย่างใดอย่างหนึ่งเท่านั้น วิธีแก้ปัญหาน่าจะอยู่ในโครงสร้าง foreach แต่ฉันไม่รู้ว่ามันทำงานอย่างไร

ฉันจะขอบคุณมากสำหรับการสนับสนุน!

[อัปเดต 2018-08-12] หลังจากการวิจัยเพิ่มเติม ฉันพบวิธีแก้ปัญหาที่ โพสต์นี้ และเปลี่ยนฟังก์ชันตามนั้น

วิธีแก้ปัญหาควรมีลักษณะดังนี้:

<select>
<option value="workshop name – date">workshop name – date</option>
...
</select>

นี่คือฟังก์ชัน:

add_filter( 'wpcf7_form_tag', 'dynamic_field_choose_workshop', 10, 2);

function dynamic_field_choose_workshop ( $tag, $unused ) {

    if ( $tag['name'] != 'workshop' )
        return $tag;

    $args = array (
        'post_type'     => 'workshop',
        'post_status'   => 'publish',
        'orderby'       => 'name',
        'order'         => 'ASC',
        'numberposts'   => - 1,
    );

    $custom_posts = get_posts($args);

    if ( ! $custom_posts )
        return $tag;

    foreach ( $custom_posts as $custom_post ) {
    $ID = $custom_post->ID;
        $tag['values'][] = $custom_post->post_title . ' - ' . rwmb_get_value('workshop_meta_boxes_date', '', $ID);
        $tag['raw_values'][] = $custom_post->post_title . ' - ' . rwmb_get_value('workshop_meta_boxes_date', '', $ID);
        $tag['labels'][] = $custom_post->post_title . ' - ' . rwmb_get_value('workshop_meta_boxes_date', '', $ID);
    }

    return $tag;

}



คำตอบ (1)


มีส่วนขยาย CF7 ที่จะทำสิ่งนี้เพื่อคุณ ลองดู Smart Grid-Layout สำหรับ CF7 ซึ่งจะแนะนำแท็กใหม่ที่เรียกว่า dynamic_dropdown นี่คือสิ่งที่คุณต้องการใช้ dynamic_dropdown สร้างฟิลด์ที่เลือกและอนุญาตให้คุณเติมตัวเลือกฟิลด์โดยใช้อนุกรมวิธาน ชื่อเรื่องของประเภทโพสต์ หรือตัวกรอง คุณต้องการใช้ตัวเลือกตัวกรองเพื่อสร้างตัวเลือกตามความต้องการของคุณ หน้าต่างป๊อปอัปของแท็กนั้นอธิบายได้ในตัว แต่ถ้าคุณติดขัด โปรดแสดงความคิดเห็นด้านล่าง และฉันจะให้คำแนะนำเพิ่มเติมแก่คุณ

ใช้แท็ก dynamic_dropdown ต่อไปนี้

[dynamic_select workshop-date-select class:select2 "source:filter"]

โดยจะสร้างฟิลด์ดรอปดาวน์ <select name="workshop-date-select"> ซึ่งจะถูกแปลงเป็น select2 jquery field ที่ส่วนหน้า และสร้างค่าแบบไดนามิก โดยใช้ฟังก์ชันต่อไปนี้ที่อยู่ในไฟล์ functions.php

add_filter('cf7sg_dynamic_dropdown_custom_options', 'filter_options',10,3);
function filter_options($options, $field_name, $form_key){
  /*first we verify if this is the right field from the right form
  in case multiple forms with similar fieldd exiss.
  the $form_key is a unique key exposed by the Smart Grid-layout plugin 
  instead of using form IDs to make forms and code more portable across servers.*/
  if($form_key != 'my-form' && $field_name != 'workshop-date-select') return $options; 
  $options = array();
  //load your options programmatically, as $value=>$name pairs.
  $args = array (
    'post_type'     => 'workshop',
    'post_status'   => 'publish',
    'orderby'       => 'name',
    'order'         => 'ASC',
    'numberposts'   => - 1,
  );
  $workshops = get_posts( $args );
  foreach($workshops as $workshop){
    $val = $workshop->post_title . ' - ' . rwmb_get_value('workshop_meta_boxes_date', '', $workshop->ID);
    $options[$val]=$val;
  }
  return $options;
}

สิ่งนี้จะสร้างฟิลด์เลือกแบบเลื่อนลงที่ต้องการในส่วนหน้า

หมายเหตุข้อควรระวัง: ฉันจะเติมค่าตัวเลือกเป็น ID โพสต์เวิร์กชอป แทนที่จะเป็นข้อความเดียวกันกับป้ายกำกับตัวเลือก เมื่อส่งแบบฟอร์มแล้ว ค่าของรหัสโพสต์สามารถใช้เพื่อกรอกอีเมลแจ้งเตือนพร้อมชื่อเวิร์กชอปและวันที่ที่ต้องการ ซึ่งให้ความยืดหยุ่นมากขึ้นในการขยายข้อมูลที่รายงานในอนาคต

person Aurovrata    schedule 13.08.2018
comment
ขอบคุณสำหรับคำใบ้เกี่ยวกับปลั๊กอิน WP ของคุณ ตอนนี้มันทำงานได้ดีและฉันต้องการทำโดยไม่ต้องใช้ปลั๊กอินอื่น แต่ผมจะบันทึกลิงค์ไว้ ;-) - person Mika L.; 22.08.2018
comment
คุณคือห้องน้ำ @MikaL มันถูกออกแบบมาให้มีปัญหาแบบนี้ในการค้นหาเหนือสิ่งอื่นใด - person Aurovrata; 23.08.2018