PHP: делаем "мини-БД" на текстовом файле. Htmlspecialchars - Преобразует специальные символы в HTML-сущности Удаление версии WP

Передача данных через массив $_SESSION разрешена однократно, переданные данные сразу удаляются. Это может пригодиться, например, при "возврате" в форму введённых в другом модуле данных.

Хорошо, когда все служебные функции объединены в один модуль, который основные модули подключают через директиву require_once . Мы свой модуль служебных функций назовём function.php и, кроме упомянутых методов trimall и magic , включим туда следующие функции:

  • read() - будет читать текущую базу и возвращать массив записей;
  • write($a) - будет записывать массив записей $a в файл;
  • get_index_by_name ($a,$name) - будет искать по имени $name соответствующую запись и возвращать её номер (с нуля) или значение -1, если запись не найдена. Это пригодится, чтобы отличать добавление новой записи от редактирования существующей.

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

Файл function.php

Обратите внимание, что функция read дополнительно фильтрует массив записей от пустых строк (на всякий случай, вообще-то их не должно возникать), а trimall сначала заменит любую непустую цепочку разделителей на один пробел (вторая preg_replace), а затем удалит возможные лишние разделители в начале и конце оставшейся строки (первая preg_replace).

Также есть нюанс с функцией read в смысле совместимости кода. Так как в единственной её строке есть анонимная функция , предполагается использование PHP версии не ниже 5.3. Если надо ниже - замените код на такой, где функция фильтрации именована или совсем не используется, как тут:

Function read () { $str=@file_get_contents (FILENAME); $a=explode("\n",$str); return $a; }

Также важно корректное приведение строки в Юникоде к нижнему регистру (см. mb_strtolower в коде). А локалью мы здесь не пользуемся.

Кажется, настало время писать основной файл index.php . Он будет решать следующие задачи:

  • выводить форму для добавления новой записи, которую обрабатывает модуль add.php;
  • рядом с формой добавления выведем дополнительные команды - очистка формы "самовызовом" скрипта без параметров (кнопка здесь не подойдёт, т.к. не передаёт на сервер данных) и ссылку для обращения к модулю сортировки записей по имени sort.php ;
  • получать от других модулей результаты их работы в виде числовой переменной $status и выводить соответствующие сообщения (массив $status_msg). Значение $status , равное нулю, будет принято по умолчанию, ему соответствует вывод краткой справки о работе программы;
  • если база непуста, показать её записи и обеспечить переход к редактированию или удалению.

Чтобы не перегружать таблицу дополнительными кнопками и ссылками, сделаем щелчок по имени переходом к редактированию записи модулем edit.php , а щелчку по полю "Число" будет соответствовать удаление записи модулем del.php .

Вот как всё выглядит при нескольких добавленных записях:

Внешний вид скрипта "Мини-БД на текстовом файле"

Файл index.php

Теперь займёмся недостающими модулями. У add.php , кажется, простая задача - получить от index.php переменные $name и $number и записать их в файл. Однако, модуль должен проверить, что ему переданы непустые данные, а также уметь отличать ситуацию, когда введено уже существующее в базе имя от ввода новой записи (см. if ($id>-1) { ... } else { ... } в коде). В последнем случае запись всегда добавляется в конец, ведь будет модуль сортировки строк по алфавиту.

Также важно, что строка $name , "пропущенная" через обработчик параметров, уже лишена "критичных" для разметки символов вроде ", ", < и >, а в массиве $a , прочитанном из файла данных, все строки лежат "как есть", и 123 не будет найдена, если $name после обработки превратилась 123 . Поэтому функции поиска записи, названной нами get_index_by_name , передаётся строка, преобразованная "обратно" к первоначальному виду с помощью стандартной функции htmlspecialchars_decode (доступна с PHP 5.1). В том же виде строка возвращается обратно в index.php через массив $_SESSION . Это обеспечит некоторое удобство работы - после ввода новой записи её данные останутся в форме и можно будет внести ещё одну запись, мало отличающуюся по имени ("Иванова" после "Иванов").

Ну а сам возврат из модуля в модуль абсолютно типовой - через стандартную функцию header . Помните, что её можно применять, только если модуль ещё ничего не выводил в браузер.

Файл add.php

Теперь о редактировании, оно будет реализовано в edit.php . Форма редактирования - почти такая же, как форма добавления, мы просто поленились сделать отдельную функцию для вывода формы. Важнее то, что модуль сам будет обработчиком данных, переданных через форму редактирования, а значит, должен отличать ситуацию, когда он только вызван, от той, когда пользователь нажал "Сохранить". Последней задаче служит проверка

If (!empty($_POST["submit"]) && !empty($name) && isset($number) && isset($id)) {

определяющая, была ли нажата кнопка и переданы все данные. Вторая ветка -

Else if (isset($a[$id])) {

предназначена для ситуации, когда в массиве $a есть запись, номер которой передан скрипту и она должна быть отредактирована. Номер записи сохраняется в скрытом HTML-поле .

Файл edit.php

Модуль удаления записи del.php будет достаточно простым, всё, что ему понадобится - получить допустимый $id записи (номер элемента в массиве $a), убрать соответствующий элемент из массива, переписать файл и вернуться на страницу главного модуля.

Файл del.php

Наконец, модуль сортировки sort.php породит новую проблему - как сортировать строки в Юникоде по алфавиту, не различая больших и маленьких букв? "Прямая" сортировка с помощью стандартной функции sort подойдёт едва ли - она считает строчную и прописную букву разными символами. Локаль мы не ставили, тем более, для её установки единой формы записи для всех операционок нет .

Ограничимся тем, что из всего многообразия функций сортировки массивов выберем usort с пользовательской функцией сравнения элементов.

Применяемое "прямое" сравнение односимвольных строк Юникода, думается, не совсем корректно, но strcmp сравнивает строки побайтово и нам не подойдёт, а вообще-то корректное сравнение любых строк в Юникоде - очень непростая задача ... У меня для русского и английского в системе всё сработало, например, после сортировки получались естественные порядки слов, такие как

Абба, Авка, авклит, бася, Боби, Бобик, бобика, Бобина

Файл sort.php

Нам остаётся создать в папке файл с именем.htaccess , где мы пропишем кодировкой по умолчанию Юникод и укажем директивы настройки кавычек для сайта, чтоб ...

В этой же папке создадим пустой (0 байт) файл data.txt (необязательно, если все права настроены).

Файл.htaccess AddDefaultCharset utf-8 php_flag magic_quotes_gpc off php_flag magic_quotes_runtime off php_flag magic_quotes_sybase off

Можете посмотреть, что получилось, и о найденных проблемах сообщить мне, я написал скрипт очень оперативно, в 2 приёма, и мог что-то не продумать:)

Коллекция полезных снипетов (кодов). Коды рассчитаны на частые задачи при редактировании или создании темы.

Как правило, все эти коды нужно размещать в файл темы 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() .

Производятся следующие преобразования:

  • "&" (амперсанд) преобразуется в "&"
  • """ (двойная кавычка) преобразуется в """ в режиме ENT_NOQUOTES is not set.
  • """ (одиночная кавычка) преобразуется в """ (или ") только в режиме ENT_QUOTES .
  • "" (знак "больше чем") преобразуется в ">"
Список параметров

Конвертируемая строка (string ).

Битовая маска из нижеуказанных флагов, определяющих режим обработки кавычек, некорректных кодовых последовательностей и используемый тип документа. По умолчанию используется ENT_COMPAT | ENT_HTML401 .

Доступные значения параметра flags Название константы Описание
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

Необязательный аргумент определяющий кодировку, используемую при конвертации симоволов.

Если не указан, то значением по умолчанию для 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-сущности. По умолчанию преобразуется все без ограничений.

This will, however, affect the HTML Code Coloring option in most HTML/PHP editors, which allows for easy understanding of the role of HTML tags. You should escape each double quote within the HTML code with a backslash.

PHP in HTML - file extensions

When a given file contains PHP code, it must have a PHP extension. In most cases this is .php, but you can also configure the .htaccess file to read the PHP code in the HTML file without renaming it or changing its extension. Below you can view the "handlers", which will have to be added in order to achieve this

For a normally configured web server: AddHandler cgi-script .html .htm A web server running FastCGI: AddHandler fcgid-script .html .htm Note: this is tested and works with the NTC web hosting servers. If you are using a different hosting provider, consult them for assistance. Additionally, if you are faced with constant problems there, you can consider switching to NTC Hosting in order to get the PHP optimized stable servers you need. HTML in PHP

You can also use HTML code in a PHP script . This can be very useful if you have built your whole page in PHP, but want to include a custom HTML form, for example. All that you need to do is reverse the order of the HTML and PHP opening tags, opening the page with PHP:

Using HTML in PHP:


Personal INFO