как изменить URL-адрес действия формы для контактной формы 7?

Я использую контактную форму 7 на сайте WordPress с несколькими формами. Мне нужно направить одну форму на другой URL-адрес действия формы, чем другие.

Я нашел ответ на предыдущую беседу ниже, но не знаю, как это сделать. Может кто-нибудь указать, какой именно код нужно включить в «дополнительные настройки» и как будет выглядеть код в functions.php?

Спасибо за вашу помощь!


ответ от diff. нить, которую я не совсем понимаю ...

* Да, вы должны изменить атрибут «действие» в форме с помощью этого перехватчика фильтра wpcf7_form_action_url. (какой будет код?) Вы можете добавить ловушку в файл functions.php своей темы, а затем просто обработать данные формы на странице ASP. (код?) *



person user1102824    schedule 06.01.2013    source источник
comment
Ссылка на предыдущую ветку? Что ты пробовал? SO не будет кодировать его для вас, хотя он может помочь вам с кодом, который вы уже пишете   -  person FelipeAls    schedule 06.01.2013
comment
Прошу прощения, я дизайнер, работающий над сайтом WP, который был создан до меня. Увидев, что контактная форма 7 уже установлена ​​и настроены различные формы, я добавил новую форму и получил уведомление по электронной почте. Но мне нужны данные для новой формы, отправленной в другой .asp, чем по умолчанию. После поиска в Интернете кажется, что это можно сделать, добавив код в дополнительные настройки в CF7, add_filter (wpcf7_form_action_url, ________) и файл function.php? Я нашел бесчисленное количество кодов php о том, как перенаправить URL-адрес, но ничего на php, чтобы изменить URL-адрес действия формы ... извиняюсь за то, что был в темноте re: this ..   -  person user1102824    schedule 06.01.2013
comment
вот ссылка на пред. поток: stackoverflow.com/questions/7101614/ contact-form-7-post-to-asp   -  person user1102824    schedule 06.01.2013
comment
Это все еще не объясняет того, что вы пробовали до сих пор. Ответ в предыдущем потоке фактически сообщает вам все, что вам нужно для написания кода, необходимого для внесения изменений. Как упомянул ФелипеАлс, мы здесь, чтобы помочь вам изучить и помочь с кодом, который вы сами разработали. Не делай свою работу за тебя.   -  person maiorano84    schedule 06.01.2013
comment
Извините, я совершенно не знаком с php, прочитал несколько статей типа учебника и немного потрясен терминами, совершенно мне незнакомыми. Мы будем очень благодарны за любую помощь или указания относительно пошагового кодирования или того, с чего начать. Спасибо.   -  person user1102824    schedule 06.01.2013


Ответы (4)


Поскольку вы совсем не знакомы с кодом PHP, я дам вам небольшой курс по программированию в Wordpress API.

Во-первых, вам нужно знать разницу между функциями и переменными. Переменная - это единый объект, который предназначен для представления произвольного значения. Значение может быть любым. Число, чье-то имя или сложные данные.

Функция - это то, что выполняет серию действий, чтобы либо отправить обратно - или вернуть - переменную, либо изменить данную переменную.

<?php
$a = 1; //Number
$b = 'b'; //String *note the quotes around it*
$c = my_function(); //Call to a function called my_function
echo $a; //1
echo $b; //b
echo $c; //oh, hello
function my_function()
{
    return 'oh, hello';
}
?>

Wordpress использует собственную систему действий и фильтров, основанную на стиле событийно-ориентированного программирования.

Это означает, что Wordpress «ожидает» определенного события, и когда это происходит, он выполняет функцию, прикрепленную к этому событию (также известную как обратный вызов). Это «Действия» и «Фильтры». Так в чем разница?

Действия - это функции, которые выполняют какие-то действия
Фильтры - это функции, которые возвращают данные

Итак, как все это вписывается в вашу проблему?

Контактная форма 7 имеет собственный фильтр, который возвращает URL-адрес, по которому информация должна быть отправлена ​​его формами.

Итак, давайте рассмотрим основы Filter Hook

add_filter('hook_name', 'your_filter');
  1. add_filter - это функция, которая сообщает Wordpress, что ему нужно прослушивать определенное событие.
  2. «hook_name» - это событие, которое ожидает Wordpress.
  3. your_filter - это функция или обратный вызов, которая вызывается при срабатывании события hook_name.

В ссылке на предыдущий поток указано, что имя ловушки, которое вам нужно использовать, - «wpcf7_form_action_url». Это означает, что все, что вам нужно сделать, это вызвать add_filter, установить «hook_name» на «wpcf7_form_action_url», а затем установить «your_filter» на имя функции, которую вы будете настраивать в качестве обратного вызова.

Как только это будет сделано, вам просто нужно определить функцию с именем, которое соответствует тому, что вы указали вместо your_filter, и просто убедитесь, что она возвращает URL-адрес для изменения действия формы.

Теперь возникает проблема: это изменит ВСЕ ваши формы. Но первое, что нужно сделать: посмотрите, сможете ли вы самостоятельно запустить какой-нибудь рабочий код. Просто напишите свой код в functions.php и дайте нам знать, как это получается.

ОБНОВЛЕНИЕ:

Тот факт, что вы смогли получить его так быстро, замечателен и показывает количество исследовательских усилий, которые вы прилагаете к этому.

Поместите все это в functions.php

add_filter('wpcf7_form_action_url', 'wpcf7_custom_form_action_url');
function wpcf7_custom_form_action_url()
{
    return 'wheretopost.asp';
}

Как упоминалось ранее, это повлияет на ВСЕ ваши формы. Если предполагается, что это влияет только на форму на данной странице, вы можете сделать что-то вроде этого:

add_filter('wpcf7_form_action_url', 'wpcf7_custom_form_action_url');
function wpcf7_custom_form_action_url($url)
{
    global $post;
    $id_to_change = 1;
    if($post->ID === $id_to_change)
        return 'wheretopost.asp';
    else
        return $url;
}

Все, что вам нужно сделать, это изменить значение $ id_to_change на число, представляющее идентификатор сообщения / страницы, на которое вы пытаетесь повлиять. Итак, если, например, у вас есть страница сведений, на которой вы хотите изменить URL-адрес действия, вы можете найти номер идентификатора своей страницы сведений в панели управления администратора (просто перейдите в редактор страниц и найдите в своем URL-адресе идентификатор number) и измените 1 на любой ID-номер.

Надеюсь, это поможет вам, и удачи вам.

person maiorano84    schedule 06.01.2013
comment
Я специально не дал вам сразу полный ответ. Вам нужно прочитать это, придумать правильный вызов add_filter и свою функцию обратного вызова самостоятельно. Как только вы это сделаете, мы сможем рассказать вам больше. Все части здесь для вас. - person maiorano84; 06.01.2013
comment
maiorano84, большое спасибо за ответ. Да, я получил add_filter ('wpcf7_form_action_url', 'formname'); но ваше объяснение проясняет логику. Я полностью потерялся в том, как убедиться, что он возвращает URL-адрес для изменения действия формы. Если бы это было вне CF7 / WP, я бы просто закодировал ‹form method = post action = ~~~ .asp› в html, но не уверен, какой будет его версия для php? Еще раз прошу прощения за непонимание. Спасибо. - person user1102824; 06.01.2013
comment
хорошо, я посмотрю на это еще немного tmrw, так как чувствую, что держу части и полностью ослеп. Спасибо. - person user1102824; 06.01.2013
comment
Я буду рядом. Я знаю, вы можете сделать это. - person maiorano84; 06.01.2013
comment
ок, придумал добавить в CF7 дополнительные настройки: add_filter ('wpcf7_form_action_url', 'formname'); и в functions.php добавляем код: function formname () {return whereToPost.asp; } - person user1102824; 07.01.2013
comment
@ user1102824 Я предоставил вам правку, которая должна делать то, что вам нужно. Я не тестировал это, но это должно помочь вам начать в правильном направлении. Спасибо, что нашли время исследовать проблему, и я буду честен: я полностью впечатлен тем, как быстро вы пришли к правильному решению. Удачи тебе. - person maiorano84; 07.01.2013
comment
Вот это да. Огромное спасибо. Протестирую на сервере tmrw и отправлю обратно. Кажется, мне нужно многому научиться ... - person user1102824; 07.01.2013
comment
Я тестировал с помощью add_filter ('wpcf7_form_action_url', 'wpcf7_custom_form_action_url'); в файле functions.php и форме после нажатия кнопки отправки отображается круг обработки и нет ответа. Поэтому вместо этого я поместил этот код в CF7 в разделе «Дополнительные настройки». Это позволяет мне получать электронное письмо с данными, но, похоже, не взаимодействует с внешним .asp. Сам URL-адрес .asp показывает ошибку при просмотре в браузере: К сожалению, произошла системная ошибка, свойство FromAddress не может быть пустым. Не уверен, нужно ли исправлять код или что-то не так с самим .asp, что может быть проблемой ИТ. - person user1102824; 08.01.2013
comment
Хорошо, что вы выяснили, куда переместить вызов add_filter. Поскольку открывается страница .asp, это означает, что действие вызывается по назначению. Ошибка означает, что данные не обрабатываются страницей .asp правильно, что не связано с Wordpress. Надеюсь, ваши айтишники смогут это понять. - person maiorano84; 08.01.2013
comment
ах, я имею в виду, что .asp не появляется через отправку формы, но когда я набираю URL-адрес .asp в браузере, появляется сообщение об ошибке. - person user1102824; 08.01.2013
comment
Что ж, ввод URL-адреса не отправляет данные в форму, поэтому ожидается ошибка. Щелкните форму правой кнопкой мыши и проверьте элемент. Что говорит действие формы? - person maiorano84; 08.01.2013
comment
проверка элемента на кнопке отправки показывает ‹form class = wpcf7-form method = post action = permalinkname # wpcf7-f6-p1178-o1›. (p1178 соответствует идентификатору страницы #) Я попытался дать функции и постоянной ссылке одно и то же имя, которое не сработало .. - person user1102824; 08.01.2013
comment
..im предполагая, что код php или код файла .php необходимо изменить ..? любые предложения / мысли приветствуются. Благодарю. - person user1102824; 10.01.2013
comment
Извините, не видел другого ответа. Помимо перемещения вызова add_filter обратно в functions.php и проверки действия формы в вашем веб-инспекторе, у меня совсем свежие идеи (я не особо использую контактную форму 7). Вы использовали первый или второй пример? Если вы использовали второй вариант, попробуйте использовать первый и посмотрите, затронуты ли все ваши формы. - person maiorano84; 10.01.2013
comment
Прошу прощения за отложенный ответ - я пробовал оба примера и размещал код в разных местах, ничего не получалось ... связался с ИТ, и они пытаются разобраться. Большое спасибо за Вашу помощь. Я считаю, что изучение php было бы более полезным в долгосрочной перспективе, чем попытки настроить темы с ограниченными результатами. Если есть какие-либо онлайн-ресурсы / книжные ресурсы, которые вы бы порекомендовали, я буду очень признателен. Еще раз спасибо за ваше время. - person user1102824; 29.01.2013
comment
@ user1102824 К сожалению, на этот раз мы не смогли его запустить. Если вы заинтересованы в изучении любого вида программирования (PHP - лишь одна из многих разновидностей), мой совет - просто сядьте и поиграйте с ним самостоятельно. Практическое обучение НАМНОГО эффективнее теории. Начните с написания сценария Hello World на PHP, а затем поэкспериментируйте, добиваясь того же результата как можно большим количеством различных способов. Руководство по PHP и Wordpress Codex ваши друзья. Удачи. - person maiorano84; 29.01.2013
comment
Не можем ли мы поставить условие на идентификатор формы? - person Maha Dev; 24.04.2017
comment
Если вы используете этот фильтр, вы потеряете такие функции, как проверка. Более того, чтобы этот фильтр работал, необходимо отключить JS от CF7. - person kanlukasz; 22.07.2020
comment
Есть ли какой-нибудь крючок для изменения действия атрибута формы? - person Sudhanshu; 10.12.2020

Отличный ответ @ maiorano84, но я думаю, вам следует проверять идентификатор формы вместо публикации. Вот моя версия.

add_filter('wpcf7_form_action_url', 'wpcf7_custom_form_action_url');
function wpcf7_custom_form_action_url($url)
{
    $wpcf7 = WPCF7_ContactForm::get_current();
    $wpcf7_id = $wpcf7->id();

    $form_id = 123;
    

    return $wpcf7_id == $form_id? '/action.php' : $url;
}

Еще вам может потребоваться отключить WPCF7 AJAX. Это можно отключить, поместив следующий код в вашу тему functions.php

apply_filters( 'wpcf7_load_js', '__return_false' );
person Abbas Arif    schedule 04.11.2020
comment
Отключить WPCF7 с помощью apply_filters AJAX у меня не работает. - person José Carlos PHP; 05.05.2021
comment
Если фильтр не работает, вы можете определить его в файле wp-config.php define('WPCF7_LOAD_JS', false); - person Abbas Arif; 05.05.2021
comment
Да, я наконец сделал это внутри wp-config.php, однако я немного поправил, потому что не хотел отключать WPCF7_LOAD_JS для каждой формы, только для одной. Работает нормально. - person José Carlos PHP; 06.05.2021

Вы можете добавлять действия после успешной отправки, как указано в документации

Добавление фильтра будет работать в том смысле, что изменит действие в форме, но, к сожалению, также нарушит функциональность плагина. Если вы добавите фильтр, как и другие ответы, предполагается, что форма сохранит состояние счетчика после отправки.

Вы можете заставить форму делать что-то еще при отправке, используя расширенные настройки, такие как:

on_submit: "alert('submit');"

дополнительные сведения о дополнительных настройках см. здесь.

person pcatre    schedule 13.06.2016
comment
Примечание. On_sent_ok и on_submit были официально удалены из контактной формы 7 5.0. Вы можете использовать события DOM вместо этих настроек. - person kanlukasz; 21.09.2019

По словам @ abbas-arif, его решение отлично работает, но имеет ограничение. Это решение изменяет действие формы для всех форм, представленных в сообщении с этим идентификатором. Лучшим решением должно быть прямое использование идентификатора формы. Чтобы получить его с помощью WordPress ›5.2, вы можете использовать:

add_filter('wpcf7_form_action_url', 'wpcf7_custom_form_action_url');
function wpcf7_custom_form_action_url($url)
{
    $cf7forms = WPCF7_ContactForm::get_current();
    $Form = $cf7forms -> id;
    
    
        switch($Form){
            case 1:
                return 'destination like salesforce url 1...';
            case 2:
                return 'destination like salesforce url 2...';
            case 3:
                return 'destination like salesforce url 3...';
            default:
                return $url;
            
        }

}
person Aculine    schedule 12.11.2020