联系表格 7 以自定义帖子类型

问题描述 投票:0回答:6

我想将联系表单 7 中的联系表单处理为自定义帖子类型。

目前,这就是我所拥有的:

<?php 

if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) &&        $_POST['action'] == "front_post") {

//store our post vars into variables for later use
//now would be a good time to run some basic error checking/validation
//to ensure that data for these values have been set
$title     = $_POST['title'];
$content   = $_POST['content'];
$Interest   = $_POST['Interest'];
$post_type = 'purchase';


//the array of arguements to be inserted with wp_insert_post
$new_post = array(
'post_title'    => $title,
'post_content'  => $content,
'tags_input'  => $tags,
'posted_data' => $Interest,
'post_status'   => 'publish',
'post_category' => array('0',$_POST['cat']),          
'post_type'     => $post_type 
);

//insert the the post into database by passing $new_post to wp_insert_post
//store our post ID in a variable $pid
//we now use $pid (post id) to help add out post meta data
$pid=wp_insert_post($new_post);

//we now use $pid (post id) to help add out post meta data
add_post_meta($pid, 'cust_key', $custom_field);


}
?>

这里是实际表格的链接:http://stage.icardpromotions.com/create-purchase-order/

我需要能够将此表单中的所有信息提取到自定义帖子类型“购买”中

如您所见,我目前正在拉入 post_content、post_title 等。

我还尝试通过输入名称“兴趣”从内容表单中提取内容,但它不起作用。

有人知道如何做到这一点吗?

php forms custom-post-type contact-form-7
6个回答
9
投票
 function save_posted_data( $posted_data ) {


       $args = array(
         'post_type' => 'post',
         'post_status'=>'draft',
         'post_title'=>$posted_data['your-name'],
          'post_content'=>$posted_data['your-message'],
       );
       $post_id = wp_insert_post($args);

       if(!is_wp_error($post_id)){
         if( isset($posted_data['your-name']) ){
           update_post_meta($post_id, 'your-name', $posted_data['your-name']);
         }
        // if( isset($posted_data['your-email']) ){
        //   update_post_meta($post_id, 'your-email', $posted_data['your-email']);
        // }
        // if( isset($posted_data['your-subject']) ){
        //   update_post_meta($post_id, 'your-subject', $posted_data['your-subject']);
        // }
         if( isset($posted_data['your-message']) ){
           update_post_meta($post_id, 'your-message', $posted_data['your-message']);
         }
      //and so on ...
      return $posted_data;
     }
 }

add_filter( 'wpcf7_posted_data', 'save_posted_data' );

--------------------解释它-------------------------

首先创建函数并添加一个钩子 wpcf7_posted_data

---第一步---

function save_posted_data( $posted_data ) {

}
add_filter( 'wpcf7_posted_data', 'save_posted_data' );

---第二步---

现在您需要向需要使用

wp_insert_post();

填充的帖子添加一些参数
$args = array(
         'post_type' => 'post',
         'post_status'=>'draft',
         'post_title'=>$posted_data['your-name'],
          'post_content'=>$posted_data['your-message'],
       );
$post_id = wp_insert_post($args);

---第三步---

检查填写的项目是否错误

if(!is_wp_error($post_id)){ //do ur stuffs }

---第四步---

现在检查是否设置字段并更新元数据 例如帖子

if( isset($posted_data['your-name']) ){
    update_post_meta($post_id, 'your-name', $posted_data['your-name']);
}

最后返回值

return $posted_data;

完整代码在上面。


1
投票

这里有一个关于如何使用您自己的代码实现上述目标的快速提示,首先注册您的自定义帖子

    add_action('init', 'my_custom_post');
    function (){
      $args = array(
       /*post type registration parameters*/
      );
      register_post_type( 'my_custom_post', $args );
    }

接下来,您想要捕获您发布的数据并创建新帖子

    add_filter( 'wpcf7_posted_data', 'save_posted_data' );
    function save_posted_data( $posted_data ) {
      $args = array(
        'post_type' => 'my_custom_post',
       /*other default parameters you want to set*/
      );
      $post_id = wp_insert_post($args);
      if(!is_wp_error($post_id)){
        if( isset($posted_data['form-field-name']) ){
          update_post_meta($post_id, 'form-field-name', $posted_data['form-field-name']);
        }
      //and so on ...
      return $posted_data;
    }

1
投票

虽然此线程中获得最多支持的答案有效,但它有一些缺陷。

首先是:如果您从提交按钮中删除“禁用”标签,您仍然可以提交表单,从而在 WordPress 中创建帖子。所以你基本上可以绕过验证。

我遇到的第二个问题可能是特定于我的用例的,因为此函数会在网站上提交任何 cf7 表单时触发。如果您有多个 cf7 表单,即使用户以某种完全不同的表单提交某些内容,这也会创建帖子。

为了解决第一个问题,我认为最好的方法是将自定义函数挂钩到“wpcf7_before_send_mail”而不是“wpcf7_posted_data” 解决第二个问题是检查您希望触发效果的表单的 id。

这就是我解决这些问题的方法:

function save_cf7_data_to_cpt( $contact_form ) {
    
    if( $contact_form->id() !== $my_form_id )
    return; //dont run the rest if it is not the form you want it to be, $my_form_id we look up in admin or shortcode...

    $submission = WPCF7_Submission::get_instance();
    if ( $submission ) {
        $posted_data = $submission->get_posted_data();
    } //we get to $post_data in this way since it is not provided like in the wpcf7_posted_data approach

  $args = array(
    'post_type' => 'testemonial',
    'post_status'=>'draft',
    'post_title'=>$posted_data['your-name'],
    'post_content'=>$posted_data['your-message'],
  );
  $post_id = wp_insert_post($args);

  if(!is_wp_error($post_id)){
    if( isset($posted_data['your-name']) ){
      update_post_meta($post_id, 'your-name', $posted_data['your-name']);
    }
    if( isset($posted_data['your-message']) ){
      update_post_meta($post_id, 'your-message', $posted_data['your-message']);
    }
 //and so on ...
 return $posted_data;
}
}

add_filter( 'wpcf7_before_send_mail', 'save_cf7_data_to_cpt' ); //hook into wpcf7_before_send_mail to ensure validation is ok

0
投票
Can u also use


    add_action('wpcf7_mail_sent','save_my_form_data_to_my_cpt');
    add_action('wpcf7_mail_failed','save_my_form_data_to_my_cpt');
    
    function save_my_form_data_to_my_cpt($contact_form){
        $submission = WPCF7_Submission::get_instance();
        if (!$submission){
            return;
        }
        $posted_data = $submission->get_posted_data();
        //The Sent Fields are now in an array
        //Let's say you got 4 Fields in your Contact Form
        //my-email, my-name, my-subject and my-message
        //you can now access them with $posted_data['my-email']
        //Do whatever you want like:
        $new_post = array();
        if(isset($posted_data['your-name']) && !empty($posted_data['your-name'])){
            $new_post['post_title'] = $posted_data['your-name'];
        } else {
            $new_post['post_title'] = 'Message';
        }
        $new_post['post_type'] = 'inquiry'; //insert here your CPT
        if(isset($posted_data['tel-901'])){
            $new_post['post_content'] = $posted_data['tel-901'];
        } else {
            $new_post['post_content'] = 'No Message was submitted';
        }
        $new_post['post_status'] = 'publish';
        //you can also build your post_content from all of the fields of the form, or you can save them into some meta fields
        if(isset($posted_data['your-email']) && !empty($posted_data['your-email'])){
            $new_post['meta_input']['sender_email_address'] = $posted_data['your-email'];
        }
        if(isset($posted_data['checkbox-674']) && !empty($posted_data['checkbox-674'])){
            //$new_post['meta_input']['sender_name'] = $posted_data['checkbox-674'];
            
            $ChildSeat=$posted_data['checkbox-674'];
            $Child_Seat='';
            for($a=0;$a<count($ChildSeat);$a++)
            {
                $data['checkbox-674']=$_POST['checkbox-674'][$a];
                $Child_Seat.=$data['checkbox-674'].'<br>';
                $new_post['post_content'] = $Child_Seat;
                
            }
      
      }
        //When everything is prepared, insert the post into your Wordpress Database
        if($post_id = wp_insert_post($new_post)){
           //Everything worked, you can stop here or do whatever
        } else {
           //The post was not inserted correctly, do something (or don't ;) )
        }
        return;
    }

0
投票

有一个插件可以执行此操作,发布我的 CF7 表单

该插件允许您将 CF7 表单及其字段映射到现有帖子类型或新的自定义帖子类型。

映射过程是使用交互式 UI 管理页面完成的,您可以选择将字段映射到帖子字段(标题、内容、摘录、slug、作者)以及帖子元字段。

此外,该插件还引入了

save
提交按钮,允许用户保存表单的草稿版本,这对于大型复杂表单尤其有用。

该插件可以自动加载已映射到该分类的

select/checkbox/radio
字段中的分类术语,从而使创建的帖子能够自动分配给用户选择的术语。

该插件有多个钩子和过滤器来定制流程。


0
投票

发布我的 CF7 表格工作正常,但有时功能图像和选择不起作用。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.