Динамическая электронная почта в CF7 (с использованием пользовательских полей)

#php #contact-form-7

#php #контактная форма-7

Вопрос:

Я пытаюсь динамически обновлять поле CF7 to, заменяя строку получателя значением пользовательского поля post, хотя я не могу понять, как присвоить значение, которое определенно заменяет строку, когда я получаю сообщение об ошибке, и если я изменяю отправленное электронное письмо. Итак, это говорит мне, что проблема в том, что я пытаюсь получить значение.

 <?php
function wpcf7_dynamic_email_field($args) {
  $dynamic_email = get_post_meta(get_the_ID(), 'dynamic_email', true);
  if(!empty($args['recipient'])) {
    $args['recipient'] = str_replace('emailtobereplaced@email.com', $dynamic_email["dynamic_email"], $args['recipient']);
    return $args;
  }
  return false;
}
add_filter('wpcf7_mail_components', 'wpcf7_dynamic_email_field');
?>
  

Может ли кто-нибудь указать мне правильное направление здесь? Мое пользовательское поле называется dynamic_email, и мне нужно значение

Ответ №1:

get_the_id() не возвращает правильный идентификатор, потому что контактная форма 7 использует Ajax для выполнения отправки.

Вы можете получить идентификатор сообщения из тега единицы отправки. Тег unit — это скрытое поле формы, которое публикуется вместе с формой, и оно выглядит загадочно, но в нем хранится информация о сообщении. Пример тега unit выглядит wpcf7-f235-p27-o1 следующим образом . Используя регулярное выражение, мы можем получить идентификатор сообщения из тега unit.

 function wpcf7_dynamic_email_field( $args ) {

    $dynamic_email = '';
    $submission = WPCF7_Submission::get_instance();
    $unit_tag = $submission->get_meta( 'unit_tag' );

    // get the post ID from the unit tag
    if ( $unit_tag amp;amp; preg_match( '/^wpcf7-f(d )-p(d )-o(d )$/', $unit_tag, $matches ) ) {
        $post_id = absint( $matches[2] );
        $dynamic_email = get_post_meta( $post_id, 'dynamic_email', true );
    }

    if ( $dynamic_email ) {
        $args['recipient'] = str_replace('emailtobereplaced@email.com', $dynamic_email["dynamic_email"], $args['recipient']);
    }

    return $args;
}

add_filter( 'wpcf7_mail_components', 'wpcf7_dynamic_email_field' );
  

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

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

1. Спасибо, это действительно полезная информация, которую я не знал. Контактная форма, похоже, отправляется сейчас, однако электронное письмо не приходит, поэтому я не уверен, что это ошибка в том, как я вызвал свое пользовательское поле? я прав, что он должен вызывать первое электронное письмо в этом поле?

2. Попробуйте изменить $dynamic_email["dynamic_email"] только $dynamic_email в вашем str_replace вызове

3. Да, я пробовал это, но безрезультатно. Я get_post_meta_values( $post_id, 'dynamic_email', true ) тоже пытался изменить, но, похоже, он не отправлял электронное письмо — не беспокойтесь. Я буду продолжать копать.

4. Добавьте file_put_contents( get_template_directory() . '/debug.log', print_r( $dynamic_email, true ), FILE_APPEND ); после получения мета-значения post. Затем проверьте отладку. войдите в свой каталог шаблонов и посмотрите $dynamic_email , какое значение

5. Не уверен, что я все сделал правильно, но он возвращается пустым