Контактная форма 7: Функция вызова только при отправке указанной c формы - PullRequest
1 голос
/ 21 февраля 2020

Я кодирую свой самый первый плагин. Это что-то вроде дополнения к теме, добавление к ней полезных вещей. Одним из них является то, что я собираю данные о еде, и поэтому я позволяю пользователям добавлять разные продукты питания через контактную форму. Сама форма довольно стандартная, и я использую хук save_posted_data для создания поста еды (как пользовательский тип поста).

Выглядит так:

function save_posted_data( $posted_data ) {

$form_id = $contact_form->id();
if( $form_id == 1903 ) {

    $args = array(
        'post_type' => 'np-food',
        'post_status'=>'draft',
        'post_title'=>$posted_data['food-name'],
        'post_content'=>$posted_data['food-desc'],
    );
    $post_id = wp_insert_post($args);

    if(!is_wp_error($post_id)){
        if( isset($posted_data['food-name']) ){
            update_post_meta($post_id, 'food-name', $posted_data['food-name']);
        }
        // and so on
    }
}
return $posted_data;
}
add_filter( 'wpcf7_posted_data', 'save_posted_data' );

Моя проблема: При проверке формы деталь должна создавать сообщение, только когда выбранная форма - та, которую использует пользователь. Но это не работает здесь, потому что каждая другая форма CF 7 заканчивается бесконечным l oop при нажатии кнопки Отправить. Только форма 1903 делает что-то (создает сообщение с нужными метаполями). Все остальное не работает.

Кто-нибудь знает, что мне здесь не хватает?

1 Ответ

1 голос
/ 22 февраля 2020

Вы можете получить заявку на before_send_mail и проверить, не вышло ли у вас имя поля.

add_action( 'wpcf7_before_send_mail', 'save_posted_data' );
function save_posted_data( $contact_form ) {

    $submission = WPCF7_Submission::get_instance();
        if ( $submission ) {
            $posted_data = $submission->get_posted_data();    
    }
    // This checks for the form tag [food-name]
    if (empty($posted_data['food-name']) || !isset($posted_data['food-name'])) return;

    // Or use this to check for form by ID (remove previous if)
    // if ($posted_data['_wpcf7'] !== '{your_form_id}') return;

    $args = array(
        'post_type' => 'np-food',
        'post_status'=>'draft',
        'post_title'=>$posted_data['food-name'],
        'post_content'=>$posted_data['food-desc'],
    );
    $post_id = wp_insert_post($args);

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

Вы также можете использовать поле _wpcf7, которое содержит идентификатор формы $posted_data['_wpcf7']

Таким образом, ваше «ЕСЛИ» будет следующим:

if ($posted_data['_wpcf7'] !== '1903') return;

Для многократной отправки форм и функций вы можете сделать это:

if ($posted_data['_wpcf7'] == '{your_form_id}') {
    // do stuff when form id = first
} else if ($posted_data['_wpcf7'] == 'second_form_id') {
   // do more stuff
}
...