#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. Не уверен, что я все сделал правильно, но он возвращается пустым