Wordpress Contact Form 7 динамически выбирает раскрывающееся поле на основе URL-адреса

У меня такой случай. У меня есть плагин Contact Form 7 и несколько страниц с разными сервисами. На каждой странице есть контактная форма с раскрывающимся списком на боковой панели со всеми услугами. Как я могу добиться этого, когда вы находитесь в определенной службе, раскрывающееся поле выбирается автоматически по умолчанию в зависимости от службы (возможно, по URL-адресу)? Я таких тем не нахожу и мне очень интересно, как это происходит. Желательно без плагина. Заранее спасибо :)


person 7onc1    schedule 04.08.2020    source источник


Ответы (2)


Предположим, у вас есть 3 службы: служба A, служба B, служба C, так что если вы находитесь на странице, принадлежащей службе B, с URL domain.com/service-b/my-page, другими словами, сам URL содержит достаточно информации, чтобы определить, что эта страница часть услуги Б. Есть 2 способа перейти к автоматическому выбору в раскрывающемся списке,

1 на стороне клиента, используя JavaScript после загрузки страницы,

используйте следующий сценарий, чтобы выбрать правильный вариант,

(function($){
$(document).ready(function(){
  //determine the current page,
  let page = window.location.href, opt='';
  //comment the following line for your site, this is only for this example test.
  page = 'http://example.com/service-b/my-page';

  switch(true){
    case page.indexOf('service-b')>0:
      opt='serviceb';
      break;
    case page.indexOf('service-c')>0:
      opt='servicec';
      break;
    case page.indexOf('service-a')>0:
      opt='servicea';
      break;
  }

  $('select[name="select-services"]').find('option[value="'+opt+'"]').prop('selected', 'selected');
})
})(jQuery)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select name="select-services">
 <option value="">select a service</option>
 <option value="servicea">Service A</option>
 <option value="serviceb">Service B</option>
 <option value="servicec">Service C</option>
</select>

2 другой способ - изменить параметр выбора на стороне сервера до загрузки страницы с помощью php и подключить фильтр do_shortcode_tag, который запускается после выполнения шорткода формы cf7. Поместите следующий код в functions.php файл вашей темы,

add_filter('do_shortcode_tag','set_service',10,3);
function set_service($html, $attr, $tag){
  //check this is a cf7 shortcode.
  if('contact-form-7' !== $tag){
    return $output;
  }
  //if you have several forms, you can also check this is the right form using $attr['id']
  //determine which page you are on
  global $wp;
  $serv='';
  switch(true){
    case false !== strpos($wp->request, 'service-a' ):
      $serv='servicea';
      break;
      case false !== strpos($wp->request, 'service-b' ):
      $serv='serviceb';
      break;
    case false !== strpos($wp->request, 'service-c' ):
      $serv='servicec';
      break;
  }
  return str_replace('value="'.$serv.'"', 'value="'.$serv.'" selected="selected"', $html);
}
person Aurovrata    schedule 05.08.2020
comment
Большое спасибо за ответ. К сожалению, я не могу справиться с обоими. Решение JavaScript дает мне синтаксическую ошибку вокруг .find - «отсутствует) после списка аргументов», а решение php вся моя контактная форма исчезает. Очевидно, я что-то делаю неправильно. Есть ли у вас какие-либо идеи? - person 7onc1; 06.08.2020
comment
извините, я сделал тип в js-коде, я исправил его и настроил как пример jsfiddle, вы можете запустить тест и посмотреть, как он работает. Вышеупомянутое решение представляет собой либо / или решение: либо 1 на стороне клиента с использованием JavaScript, либо решение 2 на стороне сервера с использованием PHP, вам не нужны оба. - person Aurovrata; 06.08.2020
comment
Да, конечно, я тоже просто не могла приспособиться. Теперь все отлично работает с javascript-решением. Большое спасибо за быстрые и правильные ответы :) - person 7onc1; 06.08.2020
comment
Спасибо за ответ! Голоса, отданные теми, у кого репутация менее 15, записываются, но не изменяют общедоступный рейтинг публикации. Извините :( Скоро будет 15 :) - person 7onc1; 07.08.2020
comment
Верно, но вы можете выбрать ответ ... если только вы не надеетесь получить другой. - person Aurovrata; 07.08.2020
comment
Ой, извини. Я сделал это :) Еще раз спасибо - person 7onc1; 08.08.2020
comment
Очень признателен :) - person Aurovrata; 11.08.2020

Вы можете попробовать обработчик фильтра wp:

add_filter( 'do_shortcode_tag','sercice_check',10,3);

function sercice_check($output, $tag, $attr){

// Checking your contact form id
// [contact-form-7 id="659" title="My Service"]

  if(  isset( $attr['id'] ) &&  $attr['id'] == 659 ){ //you can even check for specific attributes
    global $wp;

    $service='';

    // Site url like : www.mysite.com/service/service-a/
    switch(true){

        case false !== strpos($wp->request, 'service-a' ):
            $service='Service A';
        break;

        case false !== strpos($wp->request, 'service-a' ):
            $service='Service B';
        break;
    }

    return str_replace('value="'.$service.'"', 'value="'.$service.'" selected="selected"', $output);
  }

  return $output;
}
person Mahmudul Hasan Sohag    schedule 19.12.2020