Содержимое
Здравствуйте! В этой статье я опишу вам внутренне устройство и принцип работы плагина скрывающего даты «Hide My Dates».
Сам плагин разделен на две части — front end и back end.
В задачу «front end» части (то что видит гость сайта) — входит функция позволяющая прятать даты.
В «back end» (панель администратора) — входит больше информационая часть и немного настроек. Какие в принципе не нужны.
Установка плагина
Открываем файл «/wp-content/plugins/hide-my-dates/hide-my-dates.php», он отвечает за работу данного плагина. В течении всей статьи мы будет работать только с ним.
Во время установки плагина выполняется инициализация первоначальных данных. За это отвечает следующий код:
function hmd_init() { $opt_date = '1'; $opt_modifieddate = '1'; $opt_comments = '1'; add_option('hmd_opt_date', $opt_date); update_option('hmd_opt_date', $opt_date); add_option('hmd_opt_modifieddate', $opt_modifieddate); update_option('hmd_opt_modifieddate', $opt_modifieddate); add_option('hmd_opt_comments', $opt_comments); update_option('hmd_opt_comments', $opt_comments); } add_action('activate_hide-my-dates/hide-my-dates.php', 'hmd_init');
Здесь правда мне не понятно, зачем еще нужно было после установки данных в БД через ф-ю «add_option», еще и обновлять эти данные через «update_option». Возможно что автор решил таким образом перестраховаться. А возможно что я еще не знаю о некоторых тонкостях WP.
Плагин — многоязычный, и за подключение языкового файла отвечает код:
function hmd_setup(){ load_plugin_textdomain('hide-my-dates', null, dirname( plugin_basename( __FILE__ ) ) . '/lang' ); } add_action('init', 'hmd_setup');
Back End или функционал для администратора
Так как нас интересует админка. Ищем ф-ю отвечающую за вывод пункта меню в WP на страницу настроек плагина. За это отвечает следующий код:
function hdm_menu() { add_options_page('Hide My Dates', 'Hide My Dates', 'manage_options', 'hide-my-dates.php', 'hdm_options_page'); } add_action('admin_menu', 'hdm_menu');
Параметры которые принимает ф-я:
Hide My Dates (первый) — title страницы отображаемый при переходе на страницу плагина;
Hide My Dates (второй) — название пункта меню плагина в разделе меню «Настройки»;
manage_options — уровень доступа к функционалу плагина;
hide-my-dates.php — уникальный идентификатор пункта меню. Он нам может пригодиться если мы будет использовать вложенные пункты меню;
hdm_options_page — клабэк ф-я отвечающая за функционал срабатывающий при переходе на страницу плагина.
В «add_options_page» нас интересует последний параметр - «hdm_options_page». Это функция отвечающая за формирования страницы с настройками. Содержимое ф-и можно найти выше. Код ее полностью дублировать не буду, приведу лишь важные части:
/* Отвечает за получение настроек из БД */ $opt_date = get_option('hmd_opt_date'); $opt_modifieddate = get_option('hmd_opt_modifieddate'); $opt_comments = get_option('hmd_opt_comments'); /* …...... */ /* Если были получены POST данные (т. е. данные формы были отправлены на сервер), то сработает условие ниже и отобразиться соответствующее предупреждение */ <?php if ( !empty($_POST ) ) : ?> <div id="message" class="updated fade"><p><strong><?php _e('Options saved.', "hide-my-dates") ?></strong></p></div> <?php endif; ?> <div class="wrap"> /* …...... */ /* Собственно настройки */ <tr> <th><?php _e("Hide date", "hide-my-dates") ?></th><td><input type="checkbox" name="opt_date" value="1" <?php if ($opt_date == '1') echo "checked='checked'"; ?> /> <?php _e("Post creation date (the_date or the_time) will be hidden from Google.", "hide-my-dates"); ?></td> </tr> <tr> <th><?php _e("Hide modified date", "hide-my-dates") ?></th><td><input type="checkbox" name="opt_modifieddate" value="1" <?php if ($opt_modifieddate == '1') echo "checked='checked'"; ?> /> <?php _e("The last modification date (the_modified_date or the_modified_time) will be hidden from Google.", "hide-my-dates"); ?></td> </tr> <tr> <th><?php _e("Hide dates of comments", "hide-my-dates") ?></th><td><input type="checkbox" name="opt_comments" value="1" <?php if ($opt_comments == '1') echo "checked='checked'"; ?> /> <?php _e("Comment creation dates will be hidden from Google.", "hide-my-dates") ?></td> </tr>
Честно сказать, из-за не опытности долго думал и не мог понять где же обновляются настройки. В изучаемых примерах для этого использовалась ф-я «register_setting». Ее то я и искал, но все оказалось гораздо проще (возьму себе на заметку). И за это отвечает следующий код:
$pluginpage = $_SERVER["REQUEST_URI"]; if(strpos($pluginpage, 'hide-my-dates.php') == true){ if ( isset($_POST['submit']) ) { if (!isset($_POST['opt_date'])) $opt_date = '0'; else $opt_date = '1'; if (!isset($_POST['opt_modifieddate'])) $opt_modifieddate = '0'; else $opt_modifieddate = '1'; if (!isset($_POST['opt_comments'])) $opt_comments = '0'; else $opt_comments = '1'; update_option('hmd_opt_date', $opt_date); update_option('hmd_opt_modifieddate', $opt_modifieddate); update_option('hmd_opt_comments', $opt_comments); }}
Здесь мы проверяем, какой файл сработал, и если это был «hide-my-dates.php» (т. е. файл плагина) — значит можно обновить данные. А через «$_POST['submit']», мы проверяем, была ли обновлена форма. Код:
if(strpos($pluginpage, 'hide-my-dates.php') == true){ if ( isset($_POST['submit']) ) {
На этом, работа с админкой закончена.
Front End или функционал гостя сайта
Второе что мне не нравится в данном плагине — это фай стилей. К чему, он понять не могу, ведь это лишний запрос к серверу. За подключение файла отвечает код:
function hmd_stylesheet() { $purl = plugins_url(); $myStyleUrl = $purl . '/hide-my-dates/hide-my-dates.css'; wp_register_style('hide-my-dates', $myStyleUrl); wp_enqueue_style( 'hide-my-dates'); } add_action('wp_print_styles', 'hmd_stylesheet');
В конце файла присутствует список «add_action», отвечающий за подключение хуков обрабатывающие даты в нужных нам случаях.
add_filter('get_the_time', 'hide_date'); add_filter('get_the_date', 'hide_date'); add_filter('get_the_modified_time', 'hide_modifieddate'); add_filter('get_the_modified_date', 'hide_modifieddate'); add_filter('get_comment_date', 'hide_comments'); add_filter('get_comment_time', 'hide_comments');
А за «скрытие» дат отвечает следующий код:
function hide_date($tdate = '') { if ( !is_admin() ) { $opt_date = get_option('hmd_opt_date'); if ($opt_date == "1") { $tdate = '<span class="sdata" title="' . $tdate . '"></span>'; } } return $tdate; }
логика очень простая — если страницу просматривает не администратора, получаем настройки из БД. Проверяем, разрешено ли прятать даты такого типа — значит прямим их. В противном случае отображаем как есть — текстом/цифрами.
Все остальные хуки работают аналогичным образом, только из БД берутся другие настройки, а в теге SPAN используют другие классы.
А теперь наверное самое интересное, как же все таки прячутся даты. Я если честно, думал что они спрятаны с использованием jQuery. Но все оказалось проще и быстрее. Все реализовано благодаря CSS:
.sdata:before{content:attr(title);}
Здесь, благодаря псевдоэлементу «before» мы добавляем до содержимого элемента SPAN содержимое его атрибута «title».
Благодаря свойству «content» мы можем добавить в HTML страницу нужный текст.
А используя attr мы можем обратиться к любому атрибуту нашего элемента.
Вот так все просто — обратились благодаря CSS к нужному атрибуту, и добавили через псевдокласс в нужный нам SPAN дату.
На этом все. Удачного дня!
is_admin это условный тег, проверяющий открытие админки сайта. иначе даты в самой админке будут выводиться криво.
а поводу времени на разработку плагина - на само написание плагина ушло несколько часов, но вот на поиски способа скрытия дат и на его тестирование ушло несколько недель. так что не надо. да и если уж на то пошло, у меня 10 плагинов - пожертвований еще не получал 🙂 это так, для красоты - бокс этот увидел в одном плагине и мне он понравился 😉
Рад видеть Вас Flector на своем сайте. Честно сказать приятно. Надеюсь я Вас не обидел этим постом 🙂 (могу подправить если хотите)
Я поначалу подумал что даты прячутся с использованием jQuery и атрибута "data", но когда попытался выделить дату - был удивлен.
Думаю что отечественный пользователь не оценит Ваших стараний, тут нужно работать с аудиторией из запада, они мне кажется по щедрее будут. Сам подобным занимался, но за год или два получил лишь 25 рублей :). Мелочь, но все равно приятно.
Можно поинтересоваться, какие еще плагины были Вами разработаны?
это не все мои плагины, только те, которые я добавил в репозиторий.
Спасибо! обязательно гляну.
Зашел только что на Ваш сайт. Был приятно удивлен, что это был один из первых сайтов с которого я начал изучать WP.