Как и во всяком ремесле, в PHP существует масса всевозможных хитростей, ощутимо помогающих облегчить жизнь простого программиста. Вот некоторые из этих хитростей.
Трюк 1: передача массивов из формы.
Из HTML-формы можно передавать не только значения (переменные), но и массивы. Предположим, у нас есть форма со следующим полем:
При отправке данных из формы PHP-скрипт получит значение из поля cargo как переменную $cargo. Но если вместо "cargo" указать "cargo", то из поля будет отправлена скрипту уже не переменная, а массив $cargo, единственный элемент которого будет иметь единицу в качестве ключа и содержимое поля в качестве значения. При автоматическом формировании формы (скажем, при генерации прайс-листа со множеством наименований) — трюк поистине незаменимый, да и обработку массива скриптом куда проще организовать, чем анализ кучи переменных с названиями вроде tovar1, tovar2 и т. д.
Трюк 2: сокращённая форма записи условия в PHP.
Конструкцию...
echo "param=";~^~if($a==1)~^~{ echo "1"; }~^~else { echo "2"; }
Гораздо проще (и короче) изложить в сокращённой форме:
echo "param=".($a==1?"1":"2");
Трюк 3: анализ HTML-кнопок типа «submit».
HTML-кнопка «submit», как известно, отправляет данные HTML-формы серверу (в нашем случае на обработку PHP-скрипту). А как быть, если в форме нужны несколько кнопок, предусматривающих разные варианты обработки данных? Столкнувшись с этой задачей, почему-то мало кто вспоминает, что у кнопок типа «submit» есть собственный атрибут «value». Нет, конечно, всем известно, что этот атрибут выводит надпись на кнопке, иного же значения ему, как правило, не придают. Между тем в случае наличия у кнопок типа «submit» атрибута «name» текст подписей на кнопках отправляется из формы на сервер наряду с прочими данными и может быть проанализирован скриптом, что и позволит произвести столько разных обработок данных по нажатию разных кнопок типа «submit», сколько душе заблагорассудится. Преимущество трюка в том, что никаких полей типа «hidden» в этом случае не требуется.
Трюк 4: несуществующие параметры функций PHP.
Общеизвестно, что при обращении к функциям в PHP необходимо указывать ровно столько же переменных, сколько должна принимать функция:
$hour=16;~^~$minute=35;~^~echo today_is($hour,$minute);~^~...~^~function today_is($hour,$minute);~^~{~^~...~^~}
Куда менее известно, что для переменных в заголовке функции можно указывать значения по умолчанию (для использования в случае отсутствия значений переменных или самих переменных при обращении извне), что позволит обращаться к функции с любым количеством переменных или вообще не указывать их:
function today_is($hour=16,$minute=0)~^~{~^~...~^~}
Трюк 5: предотвращение кэширования JS-скриптов и CSS-стилей.
Сколько народу ежедневно ругается, изменив содержимое JS-скрипта или стилей CSS и обнаружив, что браузер прочно закешировал старую версию и ни в какую не желает показывать результаты работы новой. Особенно те, у кого в компании доступ в интернет осуществляется через прокси-сервер. Чего только не предпринимается в подобных случаях: в meta-раздел ставятся заголовки с истекшим сроком давности, meta-теги антикеширования и т. д. Между тем иногда достаточно поставить после упоминания соответствующего файла псевдопараметр в виде случайного числа, генерируемого коротеньким кусочком кода PHP:
Чтобы при открытии страницы всегда подгружалась исключительно свежая версия файла.
Трюк 6: кавычки, апострофы и интепретация текста.
К выбору контейнера для стринговых (текстовых) значений зачастую принято подходить несколько небрежно. А зря: многие забывают, что содержимое двойных текстовых кавычек (") интерпретатор PHP всегда анализирует на предмет наличия переменных, тогда как к содержимому контейнеров из одиночкых кавычек (апострофов) он абсолютно равнодушен, отображая их точно символ в символ без интерпретации.
Поэтому тексты с переменными удобнее заключать в неразрывные двойные кавычки:
$text="Здравствуйте, ${client}!";
Зато неудобочитаемый код с апострофами выполняется заметно быстрее, особенно в циклах:
$text=Здравствуйте, .$client.!;
Трюк 7: мгновенный вывод.
Ещё один отличный способ ускорить выполнение сценария — вместо того, чтобы немедленно и каждый раз выводить всё попавшееся под руку командой echo , накапливать тестовое содержимое в переменной, а затем вывести эту переменную один раз:
$mytext="variant 1";~^~$mytext.=" encode";~^~$mytext.=" access";~^~echo $mytext;
Обратите внимание, что операция конкатенации записана в сокращённом виде: $mytext.= , а не $mytext=$mytext. . Экономия времени — до десятикратного сокращения времени вывода. Впечатляет?
Трюк 8: передача массива из полей типа checkbox .
Трюк № 1 позволяет нам передавать из HTML-формы массивы. А в данном трюке проанализируем другую ситуацию: преположим, нам надо передать массив из формы, в которой есть только поля типа checkbox (это такой маленький квадратик, в котором при нажатии появляется галочка). К примеру, у нас имеется список городов, из которого пользователь может выбирать нужные ему города, но при отправке данных мы хотим отправлять не только идентификаторы выбранных пользователем городов, но и названия последних. А скрытые поля типа hidden рядом с чекбоксами нам делать очень не хочется (чтобы не утяжелять код страницы и массу отправляемых на сервер данных). Как быть?
Выход очень прост. Как известно, по умолчанию поле типа checkbox (вот такое, можете даже нажать на него: ) обычно может иметь значение «on» (поле выбрано, то есть в нём стоит галочка) или «off» (поле не выбрано). Для поля также можно указать альтернативное значение, например, 1. Однако далеко не все задумываются о том, что для этого поля можно указать вообще любое значение, да хоть текст романа «Война и мир». И это значение будет аккуратно передано серверным скриптам на анализ и обработку:
Пользователь выбирает нужные пункты, нажимает кнопку «Отправить», и на сервер отправляется массив из выбранных чекбоксов, в котором опция name чекбоксов является названием переменной, а опция value — её значением. Применительно к PHP это равнозначно строке:
$id548=Toyota Landcruiser;
А теперь снова вспомним про трюк № 1. Предположим, мы не хотим анализировать кучу переменных, а хотим вместо этого проанализировать один-единственный массив. Тоже несложно:
И в результате появления двух квадратных скобок вокруг цифры в аргументе опции name чекбокса на сервер отправляется уже не переменная $id548 , а элемент массива $id с ключом 548.
Итог? Весьма неплохой: из одного чекбокса мы передали серверу аж целых три параметра — наименование массива, ключ элемента и его значение, безо всяких дополнительных скрытых полей и лишнего HTML-кода.
20.6KPHP — это встраиваемый серверный язык программирования. Большая часть его синтаксиса заимствована из C , Java и Perl . А также добавлена пара уникальных характерных только для PHP функций . Основная цель этого языка — создание динамически генерируемых PHP HTML страниц .
PHP в HTMLПри создании сложных веб-страниц вы столкнетесь с необходимостью объединить PHP и HTML для реализации конкретных задач. На первый взгляд это может показаться сложным, так как PHP и HTML являются двумя независимыми дисциплинами, но это не так. PHP предназначен для взаимодействия с HTML , и его код может быть включен в разметку страницы.
В HTML-страницы PHP-код включается с помощью специальных тегов. Когда пользователь открывает страницу, сервер обрабатывает PHP-код , а затем отправляет результат обработки (не сам PHP-код ) в браузер.
HTML и PHP довольно просто объединить. Любая часть PHP-скрипта за пределами тегов игнорируется PHP-компилятором и передается непосредственно в браузер. Если посмотреть на пример, приведенный ниже, то можно увидеть, что полный PHP-скрипт может выглядеть следующим образом:
Привет, сегодня .
Приведенный выше код — это обычный HTML с небольшим фрагментом PHP , который выводит текущую дату, используя встроенную функцию date . При этом весь HTML будет игнорироваться PHP-компилятором и передаваться в браузер без изменений.
Интегрировать PHP в HTML действительно очень легко. Помните, что скрипт — это HTML-страница с включением определенного PHP кода . Можно создать скрипт, который будет содержать только HTML (без тегов ), и он будет нормально работать.
Более продвинутые методы:
и результат:
PHP в HTML с помощью short_open_tagЕсли нужно максимально сократить код, перед тем, как в PHP вставить HTML , вы можете использовать short_tags . В результате не нужно будет вводить .
Имейте в виду, что если нужно создать сайт, совместимый с максимальным количеством платформ, при вставке PHP в HTML не стоит полагаться на short_tags .
HTML в PHP с использованием echoЕще один способ интеграции HTML в PHP-файл — команда echo: .
Это повлияет на подсветку разметки в большинстве редакторов. Поэтому необходимо выделять все двойные кавычки внутри HTML-кода с помощью обратной косой черты.
PHP в HTML — расширения файловДля стандартно настроенного веб-сервера :
AddHandler cgi-script .html .htm
Для веб-сервера с запущенным FastCGI :
AddHandler fcgid-script .html .htm
HTML в PHPТакже можно использовать HTML-код в PHP-скриптах . Все, что нужно сделать, это при открытии страницы с помощью PHP изменить порядок открывающихся тегов HTML и PHP .
Коллекция полезных снипетов (кодов). Коды рассчитаны на частые задачи при редактировании или создании темы.
Как правило, все эти коды нужно размещать в файл темы functions.php . Или, можно создать отдельный.php файл разместить код туда и подключить файл в functions.php темы так:
// подключаем сниппеты require_once "functions-snippets.php";
Внешний вид CSS для TinyMCE редактораПодключает файл стилей к редактору WordPress TinyMCE. Так мы сможем настроить стили редактора в админке и при редактировании записи видеть как она выглядит во фронт-энде.
// Стили для TinyMCE редактора // Нужно создать файл "editor-styles.css" в папке темы add_action("current_screen", "my_theme_add_editor_styles"); function my_theme_add_editor_styles() { add_editor_style("editor-styles.css"); }
CSS для страницы входа (login)## CSS для страницы входа (login) ## Нужно создать файл "wp-login.css" в папке темы add_action("login_head", "my_loginCSS"); function my_loginCSS() { echo ""; }
CSS для админ-панелиПодключает файл стилей на все страницы админ панели. Так, можно удобно переделывать и дополнять стили админки.
## CSS стили для админ-панели. Нужно создать файл "wp-admin.css" в папке темы add_action("admin_enqueue_scripts", "my_admin_css", 99); function my_admin_css(){ wp_enqueue_style("my-wp-admin", get_template_directory_uri() ."/wp-admin.css"); }
Удаление Админ-бара с фронт-эндаАдмин бар может мешаться когда в теме используются фиксированные (плавающие) блоки. В таких случаях иногда проще убрать этот бар.
## Удаляет Админ-бар с фронт-энда add_filter("show_admin_bar", "__return_false"); ## Включаем поддержку виджетов. Добавляем область для виджетов if(function_exists("register_sidebar")){ register_sidebar(array("before_widget" => "", "after_widget" => "", "before_title" => "", "after_title" => "",)); }
Активация поддержки произвольного менюРегистрирует область (место) для меню и включает поддержку меню. После установки этого кода в админ-панели появится возможность создавать произвольные меню и прикреплять их в созданные этим кодом области. В шаблоне меню выводиться функцией wp_nav_menu() .
## Add custom menus register_nav_menus(array("main" => "Главное меню", "in_footer" => "Меню в подвале",));
Добавляем ссылки на RSS фид записей и фид комментариев вНастраиваемая фоновая картинка или фон ## Включает возможность устанавливать фоновую картинку из админки add_theme_support("custom-background");
В результате код выведет:
body.custom-background { background-color: #bdd96e; }
Включение шорткодов в виджет «Текст»Многие плагины используют шотркоды, но не у всех есть виджеты. В таком случае было бы удобно использовать шорткод плагина в виджете «Текст».
## Шорткоды в виджете "Текст" if(! is_admin()){ add_filter("widget_text", "do_shortcode", 11); }
Случайный текст по умолчанию в поле контента в админкеПри создании новой записи (поста или страницы) иногда удобно, чтобы там были какие-то заметки, пояснения как и что нужно писать. Для этого можно вставлять в контент дефолный текст:
## Случайный дефолтный текст для редактора add_filter("default_content", "writing_encouragement_func"); function writing_encouragement_func($content) { global $post_type; // Тексты для редактора, тип записи post if($post_type == "post"){ $array = array("Какое-то сообщение", "Какое-то сообщение",); return $array[ array_rand($array) ]; } // Тексты для редактора, тип записи page else { $array = array("Какое-то сообщение", "Какое-то сообщение",); return $array[ array_rand($array) ]; } }
Изменение количество записей на странице поискаПо умолчанию на странице поиска показывается столько же записей на странице сколько и везде, сколько выставлено в настройках.
Этот пример показывает как вывести 100 записей на странице.
## change amount of posts on the search page - set here to 100 add_action("pre_get_posts", "search_results_per_page_func"); function search_results_per_page_func($query) { // запрос на странице поиска if(! is_admin() && $query->is_main_query() && $query->is_search()){ $query->set("posts_per_page", 100); } return $query; }
Определяет сколько слов должно быть в цитате, которая обычно выводится на архивных страницах записей (рубрики, метки). Цитату выводит функция the_excerpt() .
## Изменение длины цитаты add_filter("excerpt_length", "custom_excerpt_length_func"); function custom_excerpt_length_func($length) { return 20; // кол-во слов }
Удаление полей из профиля в админке: AIM, Yahoo IM, Jabber ## удаляет из профиля поля: AIM, Yahoo IM, Jabber / Google Talk add_filter("user_contactmethods", "remove_contactmethod"); function remove_contactmethod($contactmethods) { unset($contactmethods["aim"]); unset($contactmethods["jabber"]); unset($contactmethods["yim"]); return $contactmethods; } Добавление полей в профиль в админке: facebook, twitter ## Добавляет в профиль поля: AIM, Yahoo IM, Jabber / Google Talk add_filter("user_contactmethods", "add_contactmethod"); function add_contactmethod($contactmethods) { $contactmethods["twitter"] = "Twitter"; $contactmethods["facebook"] = "Facebook"; return $contactmethods; } Добавление класса has_sidebar к тегу , если есть сайдбарДля того чтобы этот хак работал, нужно чтобы в теме в теге использовался, как принято, тег шаблона body_class() .
## Добавление класса `has_sidebar` к тегу ``, если есть сайдбар add_filter("body_class", "has_sidebar_func"); function has_sidebar_func($classes){ if(is_active_sidebar("sidebar")){ // добавляем класс $classes = "has_sidebar"; } return $classes; }
Добавление виджета в консольИногда может пригодится добавить виджет в консоль админ-панели, чтобы в нем разместить важную информацию касательно текущей темы.
## Произвольный виджет в консоли в админ-панели add_action("wp_dashboard_setup", "my_custom_dashboard_widgets"); function my_custom_dashboard_widgets() { wp_add_dashboard_widget("custom_help_widget", "Заметки темы", "custom_dashboard_help"); } function custom_dashboard_help() { echo "
Добро пожаловать в тему "Моя тема"! Тут некоторые заметки по теме."; }
Получим такой виджет:
Включение скрипта ответа на комментарийЭтот скрипт передвигает форму комментариев при нажатии на кнопку "Ответить".
## Подключение скрипта ответа на комментарий add_action("wp_footer", "enable_threaded_comments"); function enable_threaded_comments(){ if(is_singular() && comments_open() && get_option("thread_comments")) wp_enqueue_script("comment-reply"); }
Картинки Включение миниатюр записиПо умолчанию для записей нет блока где можно установить миниатюру записи. Чтобы такой блок появился, его нужно включить. Нужно включить поддержку миниатюр. Делается это очень просто:
## Включение миниатюр записи add_theme_support("post-thumbnails"); set_post_thumbnail_size(200, 200, true); // Normal post thumbnails
Создание дополнительных промежуточных размеров миниатюрПри загрузке изображения для нее создаются дополнительные размеры - миниатюры. К базовым размерам можно легко добавить свои - произвольные.
## Создание промежуточных размеров миниатюр if(function_exists("add_image_size")){ add_image_size("mysize-horizont", 300, 200, true); add_image_size("mysize-vertical", 400, 500, true); }
Чтобы получить зарегистрированный размер, используйте функцию:
Добавление миниатюры в RSS фид
Этот код добавляет миниатюру записи в начало RSS фида.
## Добавление миниатюры в RSS фид add_filter("the_excerpt_rss", "add_thumbnail_to_feed"); //add_filter("the_content_feed", "add_thumbnail_to_feed"); // обычно этот хук не используется, но тоже может быть... function add_thumbnail_to_feed($content){ $img = get_the_post_thumbnail(null, array(100, 80), array("align" => "left", "style" => "margin-right:15px;")); $content = $img . $content; return $content; }
Отменяем обертку картинок в тегВ контенте
При выводе контента в теме с помощью the_content() , срабатывает функция wpautop() и в результате если находится на отдельной строке, он оборачивается в
Т.е. было стало .
Этот пример показывает как убрать такое странное поведение.
## Отменяем обертку картинок в тег `
` в контенте add_filter("the_content", "remove_img_ptags_func"); function remove_img_ptags_func($content){ return preg_replace("/
\s*((?:]+>)?\s*]+>\s*(?:)?)\s*/i", "\1", $content); } // Подключение скрипта html5 для IE с cdn add_action("wp_head", "IEhtml5_shim_func"); function IEhtml5_shim_func(){ echo ""; // или если нужна еще и поддержка при печати // echo ""; }
Установим максимальное количество ревизий записиПо умолчанию кол-во ревизий записи неограниченно и это может излишне захламлять базу данных. Совсем отключать ревизии тоже не самое лучшее решение, потому что бывает что при редактировании записи что-то идет не так и внесенные данные теряются - работа коту под хвост...
Идеально - ограничить кол-во ревизий, например до 5:
If(! defined("WP_POST_REVISIONS")) define("WP_POST_REVISIONS", 5);
Определять константу надо в плагине или раньше.
Защита Удаление версии WPНужно это для того, чтобы хакеры не знали версию WP и не могли определить слабые места. Вместе с этим кодом нужно также удалить файл readme.html в корне сайта, потому что в нем тоже указывается текущая версия.
## Полное Удаление версии WP ## Также нужно удалить файл readme.html в корне сайта remove_action("wp_head", "wp_generator"); // из заголовка add_filter("the_generator", "__return_empty_string"); // из фидов и URL
Отключим выводи ошибок на странице авторизацииВ случае ошибки, при вводе логина или пароля, WP сообщает что именно было введен неправильно: логин или пароль. Это дает дополнительную информацию для «подборщиков» паролей.
Отключим возможность править файлы в админке для тем и плагиновВозможность редактировать файлы прямо из админки может стать большой дырой в защите. Давайте её закроем.
## Отключим возможность редактировать файлы в админке для тем, плагинов define("DISALLOW_FILE_EDIT", true);
Закроем публикацию через xmlrpc.phpПо умолчанию включена возможность публикации записей через файл xmlrpc.php .
Это такая возможность пубилковать записи из вне, например с почты... Чаще всего этот функционал не нужен и в нем могут быть потенциальные дыры. Поэтому его чаще всего желаетльно отключить. Кстати, в ранних версиях WordPress этот функционал был отключен по умолчанию и его нужно было включить чтобы им пользоваться.
## закроем возможность публикации через xmlrpc.php add_filter("xmlrpc_enabled", "__return_false");
(PHP 4, PHP 5, PHP 7)
htmlspecialchars — Преобразует специальные символы в HTML-сущности
ОписаниеString htmlspecialchars (string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]])
В HTML некоторые символы имеют особый смысл и должны быть представлены в виде HTML сущностей, чтобы сохранить их значение. Эта функция возвращает строку, над которой проведены эти преобразования. Если вам нужно преобразовать все возможные сущности, используйте htmlentities() .
Если входная строка переданная в эту функцию и результирующий документ используют одинаковую кодировку символов, то этой функции достаточно, чтобы подготовить данные для вставки в большинство частей HTML документа. Однако, если данные содержат символы, не определенные в кодировке символов результирующего документа и вы ожидаете сохранения этих символов (как числовые или именованные сущности), то вам недостаточно будет этой и htmlentities() функций (которые только преобразуют подстроки с соответствующими сущностями). Необходимо использовать функцию mb_encode_numericentity() .
Производятся следующие преобразования:
Конвертируемая строка (string ).
Битовая маска из нижеуказанных флагов, определяющих режим обработки кавычек, некорректных кодовых последовательностей и используемый тип документа. По умолчанию используется ENT_COMPAT | ENT_HTML401 .
ENT_COMPAT | Преобразует двойные кавычки, одинарные кавычки не изменяются. |
ENT_QUOTES | Преобразует как двойные, так и одинарные кавычки. |
ENT_NOQUOTES | Оставляет без изменения как двойные, так и одинарные кавычки. |
ENT_IGNORE | Без всяких уведомительных сообщений отбрасывает некорректные кодовые последовательности вместо возврата пустой строки. Использование этого флага не рекомендуется, так как это может привести к » негативным последствиям, связанным с безопасностью . |
ENT_SUBSTITUTE | Заменяет некорреткные кодовые последовательности символом замены Юникода U+FFFD в случае использования UTF-8 и FFFD; при использовании другой кодировки, вместо возврата пустой строки. |
ENT_DISALLOWED | Заменяет неверные коды символов для заданного типа документа символом замены юникода U+FFFD (UTF-8) или FFFD; (при использовании другой кодировки) вместо того, чтобы оставлять все как есть. Это может быть полезно, например, для того, чтобы убедиться в формальной правильности XML-документов со встроенным внешним контентом. |
ENT_HTML401 | Обработка кода в соответствии с HTML 4.01. |
ENT_XML1 | Обработка кода в соответствии с XML 1. |
ENT_XHTML | Обработка кода в соответствии с XHTML. |
ENT_HTML5 | Обработка кода в соответствии с HTML 5. |
Необязательный аргумент определяющий кодировку, используемую при конвертации симоволов.
Если не указан, то значением по умолчанию для encoding зависит от используемой версии PHP. В PHP 5.6 и старше, для значения по умолчанию используется конфигурационная опция default_charset . В PHP 5.4 и 5.5 используется UTF-8 по умолчанию. Более ранние версии PHP используют ISO-8859-1 .
Хотя этот аргумент является технически необязательным, настоятельно рекомендуется указать правильное значение для вашего кода, если вы используете PHP 5.5 или выше, или если ваша опция конфигурации default_charset может быть задана неверно для входных данных.
Для целей этой функции кодировки ISO-8859-1 , ISO-8859-15 , UTF-8 , cp866 , cp1251 , cp1252 и KOI8-R являются практически эквивалентными, предполагая то, что сама строка string содержит корректные символы в указанной кодировке, то символы, изменяемые htmlspecialchars() , останутся на тех же местах во всех этих кодировках.
Поддерживаются следующие кодировки:
ISO-8859-1 | ISO8859-1 | Западно-европейская Latin-1. |
ISO-8859-5 | ISO8859-5 | Редко используемая кириллическая кодировка (Latin/Cyrillic). |
ISO-8859-15 | ISO8859-15 | Западно-европейская Latin-9. Добавляет знак евро, французские и финские буквы к кодировке Latin-1(ISO-8859-1). |
UTF-8 | 8-битная Unicode, совместимая с ASCII. | |
cp866 | ibm866, 866 | Кириллическая кодировка, применяемая в DOS. |
cp1251 | Windows-1251, win-1251, 1251 | Кириллическая кодировка, применяемая в Windows. |
cp1252 | Windows-1252, 1252 | Западно-европейская кодировка, применяемая в Windows. |
KOI8-R | koi8-ru, koi8r | Русская кодировка. |
BIG5 | 950 | Традиционный китайский, применяется в основном на Тайване. |
GB2312 | 936 | Упрощенный китайский, стандартная национальная кодировка. |
BIG5-HKSCS | Расширенная Big5, применяемая в Гонг-Конге. | |
Shift_JIS | SJIS, SJIS-win, cp932, 932 | Японская кодировка. |
EUC-JP | EUCJP, eucJP-win | Японская кодировка. |
MacRoman | Кодировка, используемая в Mac OS. | |
"" | Пустая строка активирует режим определения кодировки из файла скрипта (Zend multibyte), default_charset и текущей локали (см. nl_langinfo() и setlocale() ), в указанном порядке. Не рекомендуется к использованию. |
Замечание : Остальные кодировки не поддерживаются, вместо них будет применена кодировка по умолчанию и сгенерировано предупреждение.
double_encodeЕсли параметр double_encode выключен, то PHP не будет преобразовывать существующие html-сущности. По умолчанию преобразуется все без ограничений.