WordPress CF7 не может перенаправлять действия по отправке почты

#wordpress #redirect #contact-form-7

Вопрос:

Я пытаюсь перенаправить свою страницу на URL-адрес, который я получаю из ответа на сообщение curl.
Это мой код:

 add_action( 'wpcf7_mail_sent', 'action_wpcf7_mail_sent'); 
function action_wpcf7_mail_sent( $contact_form ) {
    if ( $contact_form->id !== 127 )
        return;
    $wpcf7 = WPCF7_ContactForm::get_current();
    $submission = WPCF7_Submission::get_instance();
    $save = $submission->get_posted_data();
    $data = //the data I send
    $url= 'http://my-url';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: application/json']);
    $response = json_decode(curl_exec($ch));
    curl_close ($ch);
    //I need to redirect my contact form to response['redirect_url']
}; 
 

Мне нужно перенаправить мою контактную форму на ответ[‘redirect_url’]
Я перепробовал несколько вещей, но все они не сработали:
wp_redirect($response["redirect_url"]);

header( 'Location: '.$response["redirect_url"] );

Как с помощью exit; , так и

 ?><script type="text/javascript">
        location = <?php echo $response["redirect_url"] ?>;
</script><?php
 

Но все они выдали ошибку.
Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи!

Редактировать
Я попытался немного изменить свой код!
Я попытался поймать cf7mailsent из js, а затем вызвать функцию php следующим образом:

 document.addEventListener( 'wpcf7mailsent', function( event ) {
  var inputs = event.detail.inputs;
  $.ajax({
    type: "POST",
    datatype:"json",
    url:jsforwp_globals_sub.ajax_url,
    data: { 
        action:"send_this_data",
        ajax_nonce:jsforwp_globals.send_info,
        info:inputs,
    }
  }).done(function(mess) {
    msg=jQuery.parseJSON(mess);
    if(typeof msg['redirect_url']!="undefined"){
        window.location.href = msg['redirect_url'];
    }else if(typeof msg['message']!="undefined"){
        alert(msg['message']);
    }else{
        alert('failed' mess);
    }
  }).fail(function(xhr, status, error) {
  });
});
 
 add_action("wp_ajax_nopriv_send_this_account","action_wpcf7_mail_sent");
function action_wpcf7_mail_sent() {
    $save=$_POST["inputs"];
    //the rest of the code from $save = $submission->get_posted_data();
    echo json_encode($response);
    wp_die();
}
 

но это не работает, каково было бы правильное решение для этого?
Большое спасибо!

Подробная информация
Проблема в том, что когда я пытаюсь использовать $save, я почти уверен, что он дает null

Комментарии:

1. Дает ли это вам лучший подход ? — contactform7.com/redirecting-to-another-url-after-submissions

2. к сожалению, я получаю URL-адрес, на который мне нужно перенаправить пользователя с functions.php поэтому я бы не знал, как передать туда URL-адрес

3. Две вещи. 1: вы должны использовать это в сравнении с тем, что вы делаете $contact_form->id() , чтобы получить идентификатор формы. 2. Вам нужно будет прикрепить действие ajax к объекту wpcf7mailsent DOM, чтобы получить URL-адрес. Либо это, либо отключите отправку JS, чтобы она не использовала отправку формы API ajax/wp-json.

4. Спасибо! Я уже пытался это сделать. У меня возникли проблемы с передачей значений контактной формы в функцию php, есть какие-нибудь подсказки по этому поводу? Я изменю вопрос, чтобы он отображал новый код.

5. Ваше действие требует send_this_data , но ваше wp_ajax_nopriv_send_this_account использование send_this_account — я бы также добавил wp_ajax_{action} для зарегистрированных пользователей.

Ответ №1:

Плагин CF7 не обеспечивает такой сложности, и единственный способ решить эту проблему-запустить двойное перенаправление, первое с использованием события CF7 JavaScript, инициирующего перенаправление, как описано на странице плагина, а второе на сервере с помощью функции wp_redirect ().

Шаг 1, используйте перенаправление CF7, которое требует, чтобы вы жестко закодировали ссылку во время загрузки формы на вашей странице. Создайте для этого страницу по умолчанию, скажем form-redirection ,

 add_filter('wpcf7_form_hidden_fields','add_hidden_nonce');
function add_hidden_nonce($fields){
  $nonce = wp_create_nonce('cf7-redirect-id');
  $fields['redirect_nonce'] = $nonce;
  /*
   hook the shortcode tag filter using an anonymous function 
   in order to use the same nonce and place a redirect js event 
   script at the end of the form. 
  */
  add_filter('do_shortcode_tag', function($output, $tag, $attrs) use ($nonce){
    //check this is your form, assuming form id = 1, replace it with your id.
    if($tag != "contact-form-7" || $attrs['id']!= 127) return $output;
    $script = '<script>'.PHP_EOL;
    $script .= 'document.addEventListener( "wpcf7mailsent", function( event ){'.PHP_EOL;
    //add your redirect page url with the nonce as an attribute.
    $script .= '    location = "'.esc_url(home_url('/form-redirection/?cf7='.$nonce)).'";'.PHP_EOL;
    $script .= '  }'.PHP_EOL;
    $script .= '</script>'.PHP_EOL;
    return $output.PHP_EOL.$script;
  },10,3);
  return $fields;
}
 

ПРИМЕЧАНИЕ. введение уникального номера гарантирует, что вы сможете однозначно идентифицировать отправку. Значение nonce добавляется в виде скрытого поля в вашей форме (которое вы можете получить при отправке), а также в URL-адресе перенаправления, чтобы определить, какая отправка перенаправляется.

Шаг 2: выполните обработку отправки с помощью функции, запущенной на 'wpcf7_mail_sent' крючке в вашем ответе, и сохраните полученные $response результаты в переходном режиме, используя уникальный nonce, введенный в шаге 1,

 add_action( 'wpcf7_mail_sent', 'action_wpcf7_mail_sent'); 
function action_wpcf7_mail_sent( $contact_form ) {
    if ( $contact_form->id !== 127 ) return;
    //make sure the nonce is available too,
    if(!isset($_POST['redirect_nonce']) return;
    ...
    $response = json_decode(curl_exec($ch));
    curl_close ($ch);
    //I need to redirect my contact form to response['redirect_url']
    //so store in a transient
    set_transient('_cf7_data_'.$_POST['redirect_nonce'], $response['redirect_url'], 5*60); //5 min expiration.
}
 

Шаг 3. на своей странице перенаправления определите отправку формы, извлеките сохраненные данные ответа из переходного процесса и перенаправьте в свое конечное местоположение…

 add_action('init', 'redirect_cf7_submission');
function redirect_cf7_submission(){
  if( isset($_GET['cf7']) ){
    $transient = '_cf7_data_'.$_GET['cf7'];
    $url = get_transient($transient);
    if(false === $url) $url = home_url(); //or back to the form page?
  }else $url = home_url(); //or back to the form page?
  wp_redirect($url);
}
 

Комментарии:

1. Большое вам спасибо за подробное объяснение! Я пробовал что-то подобное, но я думаю, что попробую изменить код на ваш, он выглядит более эффективным!

2. вы в порядке, дайте мне знать, сработало ли это, так как у меня не было времени полностью протестировать его. Было бы неплохо исправить код, если он не работает, чтобы другие тоже могли его использовать.