Многие уже заметили, что я предпочитаю не ставить на блог лишние плагины. Поэтому, когда я решил установить на своём блоге форму обратной связи, я начал искать решение без использования плагина. Решение я быстро нашёл, начал настраивать и понял, что работает она немного некорректно. Функционально и внешне форма работает, письма отсылаются, но нарушена логика взаимодействия с движком WordPress. Я начал разбираться в подробностях работы скрипта. В результате нашёл несколько вариантов решения проблемы, одним из которых является настройка индивидуального шаблона для страницы контактов.
Возможность установки индивидуальных шаблонов для отдельных страниц появилась в 3-й версии WordPress. Раньше были варианты настройки шаблона для отдельной страницы в ручном режиме, нужно было вписывать специальный код с привязкой к id страницы в общий шаблон. Но начиная с WordPress 3.х.х индивидуальный шаблон страницы можно задать прямо из панели администрирования.
Количество пунктов для выбора шаблона и их названия зависят от состава вашей темы. Вопрос отличия темы от шаблона рассматривался в одной из предыдущих статей. У меня имеются базовый шаблон и ещё три варианта.
Как создать свой собственный индивидуальный шаблон для отдельной страницы?
Очень просто. В шаблоны страницы попадают файлы-шаблоны темы, название которых отличается от зарезервированных в WordPress имён. Например index.php — это общий базовый файл темы (шаблон). header.php — шаблон шапки сайта, category.php служит для вывода рубрик и т.п. Нас интересует файл с именем page.php — это специальный файл темы, который отвечает за внешний вид статических страниц. В вашей конкретной теме его может не быть, тогда страницы будут выводиться в соответствии с настройками в файле single.php или index.php, если первого в вашей теме вдруг не будет. Такая в WordPress заложена логика работы.
Для индивидуального шаблона страницы я взял за основу стандартный файл своей темы page.php, скопировал его и переименовал полученный файл в contacts-page.php. Обычный php файл станет файлом шаблона, если добавить в его начало специальный комментарий с названием шаблона.
<?php /* * Template Name: Contacts Page * Description: The template for displaying page with contacts and feedback. * * @package WordPress * @subpackage Seorubl-Blog * @since Seorubl-Blog 1.3 */ ?>
«Contacts Page» — это имя шаблона, которое отображается в меню настройки свойств страницы.
Как установить на блоге форму обратной связи без плагинов?
В созданный ранее файл contacts-page.php я добавил код для вывода и обработки формы обратной связи.
<?php if (isset($_POST['submitted'])) { if (trim($_POST['contactName']) === '') { $nameError = __('Please enter your name', 'twentyeleven'); $hasError = true; } else { $name = trim($_POST['contactName']); } if (trim($_POST['email']) === '') { $emailError = __('Please enter your email address', 'twentyeleven'); $hasError = true; } else if (!preg_match("/^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i", trim($_POST['email']))) { $emailError = __('You entered an invalid email address', 'twentyeleven'); $hasError = true; } else { $email = trim($_POST['email']); } if (trim($_POST['messege']) === '') { $commentError = __('Please enter a message', 'twentyeleven'); $hasError = true; } else { $messege = stripslashes(trim($_POST['messege'])); } if (trim($_POST['control']) != true) { $controlError = __('Enter the checkbox I\'m human', 'twentyeleven'); $hasError = true; } else { $control = trim($_POST['control']); } if (!isset($hasError)) { $emailTo = get_option('admin_email'); if (trim($_POST['subject']) != '') { $subject = trim($_POST['subject']); } else { $subject = ''; } $body = __('From', 'twentyeleven') . ": $name <$email>\n\n" . __('Messege', 'twentyeleven') . ":\n$messege\n\n--\n" . __('This mail is sent via contact form on ', 'twentyeleven') . get_bloginfo('name') . "\n" . get_bloginfo('url'); $headers[] = "From: $name"; $headers[] = "Reply-To: $email"; /* $headers[] = "To: $emailTo"; */ wp_mail($emailTo, $subject, $body, $headers); $emailSent = true; unset($_POST['contactName'], $_POST['email'], $_POST['subject'], $_POST['messege'], $_POST['control']); } } ?> <div id="feedback"> <h3 class="title-feedback">Форма обратной связи</h3> <?php if (isset($emailSent) && $emailSent == true) { ?> <div class="good"> <p><?php _e('Thanks, your email was sent successfully', 'twentyeleven'); ?></p> </div> <?php } else { ?> <?php if (isset($hasError)) { ?> <p class="error"><?php _e('Sorry, an error occured', 'twentyeleven'); ?><p> <?php } } ?> <form action="<?php the_permalink(); ?>" id="contactForm" class="contactForm" method="post"> <p class="contactName"> <label for="contactName"><?php _e('Name', 'twentyeleven'); ?></label><span class="required">*</span> <input type="text" size="40" name="contactName" id="contactName" value="<?php if (isset($_POST['contactName'])) echo $_POST['contactName']; ?>"/> <?php if ($nameError != '') { ?> <span class="error"><?php echo $nameError; ?></span> <?php } ?> </p> <p class="email"> <label for="email"><?php _e('E-mail', 'twentyeleven'); ?></label><span class="required">*</span> <input type="text" size="40" name="email" id="email" value="<?php if (isset($_POST['email'])) echo $_POST['email']; ?>"/> <?php if ($emailError != '') { ?> <span class="error"><?php echo $emailError; ?></span> <?php } ?> </p> <p class="subject"> <label for="subject"><?php _e('Subject', 'twentyeleven'); ?></label> <input type="text" size="40" name="subject" id="subject" value="<?php if (isset($_POST['subject'])) echo $_POST['subject']; ?>"/> </p> <p class="messege"> <label for="messege"><?php _e('Message', 'twentyeleven'); ?></label><span class="required">*</span> <textarea name="messege" rows="10" cols="70" id="messegeText" rows="20" cols="30"><?php if (isset($_POST['messege'])) { if (function_exists('stripslashes')) { echo stripslashes($_POST['messege']); } else { echo $_POST['messege']; } } ?></textarea> <?php if ($commentError != '') { ?> <span class="error"><?php echo $commentError; ?></span> <?php } ?> </p> <p class="question"> <input type="checkbox" name="control" id="control" value=<?php if (isset($_POST['control'])) echo "\"".$_POST['control']."\" checked=\"checked\""; ?>/> <label for="control"><?php _e('I\'m Human', 'twentyeleven'); ?></label> <?php if ($controlError != '') { ?> <span class="error"><?php echo $controlError; ?></span> <?php } ?> </p> <p class="form-submit"> <input type="submit" id="submit" value="<?php _e('Send', 'twentyeleven'); ?>"></input> <input type="hidden" name="submitted" id="submitted" value="true" /> </p> </form> </div>
В оригинальной версии этот код советуют выводить с помощью механизма шорткодов. Вывод формы на странице происходит при этом в первую очередь, и мы не можем, например, добавить текст перед формой обратной связи. В данном случае для правильной работы шорткодов нужно переписать код. Вывод формы следует организовать в виде функции, которая возвращает результат в переменную. И уже результат работы функции выводить с помощью шорткодов на страницу.
Мне было лень переписывать код, поэтому я решил организовать работу формы через индивидуальный шаблон страницы контактов. Тем более я не планирую выводить форму для обратной связи где-либо кроме страницы «О блоге». А шорткоды всё-таки чаще используются для вывода кода внутри постов в произвольном месте.
Изначально подписи к полям формы и сообщения об ошибках выводятся на английском языке. Но в коде имеются специальные функции для автоматического перевода, например:
<?php _e('Message', 'twentyeleven'); ?>
где «twentyeleven» имя моей базовой темы. Варианты перевода добавляются в языковые файлы темы ru_RU.mo и ru_RU.po с помощью специального редактора. Если у вас нет этих файлов или вы не хотите разбираться с механизмом перевода тем WordPress, то можно перевести сообщения прямо в коде.
Например, код по типу
<?php _e('Message', 'twentyeleven'); ?>
следует заменить на
<?php echo "Сообщение"; ?>
а
" . __('Messege', 'twentyeleven') . "
на простое
Сообщение
У меня получилась вот такая форма обратной связи:
Я специально стилизовал её под форму комментариев на этом блоге. Также для защиты от спаммеров добавил чекбокс «Я Человек».
В общем, если у вас есть вопросы, предложения или конструктивная критика, пишите мне через форму обратной связи — внимательно прочитаю :-).
Применение индивидуального шаблона страницы для формы обратной связи — это только один частный случай. На самом деле механизм индивидуальных шаблонов открывает нам широкие возможности. Например, с его помощью можно организовать витрину с товарами или какой-либо уникальный сервис и т.п.
Ну, ваша тематика, уважаемый П.Ч., потихоньку преходит на более узкий круг подписчиков, которые уже должны владеть хотя бы основами программирования. Да, друзья, это вам не 15 км пройти или отжаться в упоре лежа:-) как в предыдущем марафоне уважаемого Админа. Эй, подписчики, разве я не прав????????????????????????????
Не кричи так громко мы
в лесуна блоге одни. Читателей пока мало, могу себе позволить писать узкоспециализированные статьи. А если серьёзно, то скоро будут новые посты для начинающих. Я тоже не во всех вопросах специалист и потихоньку осваиваю новые для себя темы. Буду соответственно освещать их в дальнейшем на этом блоге.Вы уже не одни. Заглянула на огонёк. И хотя я пока не владею кодом HTML, но статью просмотрела с интересом. Надо уже осваивать коды, а то иной раз хочется чуть-чуть шаблон подправить, а я смотрю в редактор, как баран на новые ворота. Такие статьи очень даже полезны. Конечно, для не совсем новичков. Мотивируют на изучение кодов.
Очень рад. Хотел сказать, что у вас на блоге и так всё круто, но сейчас посмотрел внимательнее и вижу, что например, кнопка G+ немного выезжает за границы страницы. Есть над чем поработать :-). Могу вам посоветовать хороший сайт для того, чтобы вникнуть в основы HTML и CSS htmlbook.ru — я учился по справочнику автора этого сайта. Информация структурирована, огромное количество наглядных примеров. Есть статьи как для новичков, так и для продвинутых пользователей.
Не знаю, откуда ты взял, что custom templates в WP появились с 3ей версии 🙂 . Они были еще в 2.6 ТОЧНО ПОМНЮ! А скорее всего и того раньше. В 3ей ветке добавились пользовательские типы записей, кажись, и таксономия. Произвольные шаблоны страниц были задолго до неё.
ну, и твоя, судя по всему, боязнь плагинов, которую я встречаю уже не знаю в который раз у людей, слабо знакомых с php в принципе, ничем не обоснована 🙂 . Поставь себе contact form 7, сделай deregister подключаемых этим плагином файлов .css и .js, а сами коды этих файлов скопируй в свои основные .css/.js- файлики уже подключенные к шаблону. Ну, и на выходе получишь 1 в 1 ту же «нагрузку» на шаблон, если можно так выразиться, только + с настройками всего этого дела из админки и миллионом удобнейших фишек, которые дают плагины 🙂 . Например, те же поступающие с сайта письма/заявки сохранять в БД и удобно затем из админки просматривать при помощи дополнения к contact form 7…
Я тебе как разраб с 4х летним стажем скажу, что все идеи типа «ла-ла-ла без плагинов» — это такая дурная экономия на спичках и производительности в 0.0000000000000000000000001%, что мне порой смешно становится 🙂 . Pagenavi без плагинов, breadcrumbs без плагинов… Бредятина чистейшей воды :))))) . Нагрузка там добавляется разве что за счет подключения доп. .css/.js файлов, которые также легко отключаются через functions.php и вручную мержатся с нативными файлами темы. И все. Никакой нагрузки и лишних запросов, и нормальная работа в стиле «белого человека» — из админки!
В общем, не бойся ты так плагинов 🙂 . Contact form 7 ставится и настраивается в 2 минуты. Доп. файлы отключаются и мержатся еще за минуту.
Не могу себя назвать знатоком отличий между версиями WordPress :-). С этой CMS плотно познакомился начиная где-то с версии 2.9. Кстати, в статье я не написал, что custom templates появились в 3-й версии. Я написал, что индивидуальные шаблоны для страниц стало можно назначать из админки. Но в этом утверждении я тоже сейчас уже не уверен, так как откуда я это взял, я сейчас сам найти не могу :-). Раньше точно можно было индивидуальные шаблоны назначать через создание файлов типа page-{id}.php или page-{slug}.php. В общем признаю, что мог допустить ошибку, но не думаю, что она критична в данной ситуации.
Боязни к плагинам как таковой нет. Здесь больше страсть к ковырянию в коде. А мифический выигрыш в производительности — это больше бонус.
Также плагины — это чей-то чужой код, который мне не подконтролен. Будет автор поддерживать и развивать свой плагин или нет, я не знаю. Встроил он туда вредоносный код или нет, я не знаю. Будет этот плагин работать с новой версией WordPress и как скоро, я не знаю. Про компетентность и профессионализм автора, я тоже ничего не знаю.
Шутки шутками, а большое количество плагинов нагружает хостинг, хотя бы за счёт лишней функциональности, которая мне может быть сто лет не сдалась. Плюс все эти манипуляции с объединением кода мне лень делать. А посмотришь, как у людей по десятку разных css, js файлов подключено, пяток разных версий jquery, так диву даёшься, как это вообще всё работает. А потом ещё жалуются, почему сайт плохо грузится, непонятные ошибки вылазят периодически.
Повторюсь, плагинов не боюсь, они у меня даже стоят. Но по минимумому, только то, что мне действительно нужно. И как php программист я, конечно, понимаю, что нет разницы, что ты просто файл подключаешь к теме, что ты подключаешь его через механизм плагинов, в любом случае за всеми специальными wp_функциями скрываются в итоге стандартные функции PHP. А так как wp_функции возможно писали программисты с большим опытом работы, то есть основания полагать, что организованы они грамотно и оптимально, что нельзя гарантировать про самопальные коды, скаченные непонятно откуда из Интернета.
« … без плагинов» — это скорее больше дань SEO, чем экономии :-). У меня, например, давно вкралась мысль, что раздувать своими кодами файл functions.php даже вредно, к сожалению, нет времени изучить этот вопрос более детально. Плагины особенно удобны, когда тебе надо делать несколько сайтов. Плагин быстро поставил и дело в шляпе. А с переносом своих пользовательских кодов ещё повозиться придётся :-).
А к экономии на плагинах призывают, я так заметил, люди которые далеки от программирования, они услышали звон и повторяют его. Экономить надо, но с умом. Нужно обязательно определиться что в данном случае важнее нагрузка или масштабируемость и удобство.
Мне, например, ещё не нравятся различные хуки с применением фильтров обработки строк. Внешне выглядит всё удобно, красиво и эффектно. Но я то как программист знаю, что регулярные выражения работают медленно, сильно нагружают сервер и по возможности от них лучше избавляться. Кстати, поэтому мне не нравятся плагины, я не знаю, какие конкретно функции и приёмы в нём применил автор, насколько его код оптимален.
Ладно, заканчиваю свою писанину, просто давно уже размышлял над этими вопросами, а повода высказаться не было :-).
да, все верно! Я вижу, ты и сам в этом хорошо разбираешься. Тогда оставлю попытки наставить на путь правильный заблудшую душу :)))) . Рад, что ты в теме!
Спасибо за заботу :-). Это очень хорошо, что в мире есть неравнодушные люди, которые не проходят мимо, и пытаются помочь другим людям выйти на правильный путь.
Здравствуйте. Что-то не получилось как у Вас — у меня пустая страница. Использую так же twenty eleven. Скажите пожалуйста, между какими строчками в page.php Вы вставили код. А можете поделиться готовым файлом?
Спасибо
Здравствуйте. Ответил по почте, отправил архив с нужным файлом.
Слава Богу, нормальное объяснение, про шаблоны для страниц. На других сайтах только однотипный текст. Я так понимаю, что если мне нужно заменить отображение содержимого page, то мне только этого файла копию нужно создать, а header и footer не трогать?
В принципе да, если, вы, конечно, не захотите сделать что-то совсем отличное от базового шаблона.