WP фишки
Содержание
- 1 Ключи безопасности
- 2 Дочерняя тема
- 3 Пишем плагин
- 4 Сделать так, чтобы на главной странице выводилась статичная страница (Page)
- 5 Шаблон страницы
- 6 Вставляем меню
- 7 Определяем тип страницы
- 8 Перевод темы
- 9 Вывод вместо поста шести миниатюр первых шести картинок в этом посте
- 10 Защита почтовой ссылки
- 11 Шорткоды
- 12 Восстановление пароля
- 13 Flash перекрывает элементы страницы (фото, меню...)
- 14 Оптимизация
- 15 Поиск по страницам
- 16 Карта сайта
- 17 Отключение скрипта wp-cron.php
- 18 Javascript и jQuery
- 19 Глюки IE8
- 20 Strict Standards: Declaration of ... should be compatible with ..
- 21 Плагины безопасности
- 22 Видео
- 23 Ошибки
Ключи безопасности
Поменять ключи безопасности в файле wp-config.php можно здесь
Дочерняя тема
Описание дочерний темы. Позволяет вносить изменения в дизайн и поведение темы, но иметь возможность так же получать обновления родительской темы.
Пишем плагин
Ninja Forms Wordpress - мой пример дочернего плагина.
Сделать так, чтобы на главной странице выводилась статичная страница (Page)
Для этого находим начало цикла (loop) в файле index.php или home.php темы (или что у вас там есть), строка вида:
<?php while (have_posts()) : the_post(); ?>
И перед ней вставляем строку:
<?php query_posts('page_id=1'); ?>
где 1 - id требуемой страницы
или строку вида:
<?php query_posts('pagename=myhome'); ?>
где myhome - имя требуемой страницы
Подробности тут.
Шаблон страницы
Копируем в шаблоне файл страницы например /wp-content/themes/имя_темы/page.php и называем например /wp-content/themes/имя_темы/pagemy.php вставляем в начало:
<?php /* Template Name: My Page */ ?>
теперь появилась возможность менять шаблон страницы в админке.
Вставляем меню
Используем функцию wp_nav_menu, например так:
<?php wp_nav_menu('menu=Menu&container=&menu_class=sf-menu sf-js-enabled'); ?>
Читаем тут.
Определяем тип страницы
главная страница
if (is_home()){ echo "Вместо echo ставим, что хотим видеть на главной странице"; }
ВНИМАНИЕ!!! WordPress меняет тип страницы, после использования query_posts!!!
Для того что бы этого избежать используем следующую конструкцию:
$is_home = is_home(); .............. if ($is_home) { echo "Вместо echo ставим, что хотим видеть на главной странице"; }
Если требуется использовать в разных файлах, то еще меняем конструкцию:
Самый первый файл, например index.php или header.php:
global $is_home; $is_home = is_home();
Там где требуется, например sidebar.php:
global $is_home; if ($is_home) { echo "Вместо echo ставим, что хотим видеть на главной странице"; }
Перевод темы
Для поиска русских слов выполним в каждой папке:
egrep -i "([а-я]* *)*" -o -h -r ./*.php | grep -v "^ *$" | sed "s/^ *//" | sed "s/ *$//" | sort | uniq
Для поиска файлов содержащие русские слова выполним в каждой папке:
egrep -i [а-я] -r ./*.php
Для перевода темы мы должны найти все строки которые мы хотим перевести и заменить требуемую строку <строка> на конструкцию вида: внутри php блока:
__('<строка>', 'themename-theme')
вне php блоков:
<?php _e('<строка>', 'themename-theme'); ?>
themename-это название темы.
- Затем устанавливаем программу Poedit.
- Запускаем poedit. Затем Файл -> Создать каталог
- На первой вкладке Информация о проекте главным образом выбираем правильную кодировку, остальное на своё усмотрение.
- На второй вкладке Пути указываем путь к папке с исходным кодом темы (для ускорения процесса, можно скопировать только структуру папок содержащих php-файлы и сами php-файлы в произвольную папку на собственном компьютере), добавляем путь (кнопка "Новый путь") в который ставим точку ("." - текущая директория)
- Ключевые слова - добавляем:
__ _e
- Нажимает Ок.
- После того как программа просканирует каталог выдаст список исходных строк, сохраним "Сохранить как" в папку например language, если тема была на английском, то назовем файл en_US.po и получим два файла en_US.mo и en_US.po. Затем переведем все строки и сохраним "Сохранить как", если переводили на русский, то назовем ru_RU.po.
- Теперь копируем папку language в корневую папку нашей темы.
- В корневой папке темы находится файл functions.php, добавляем в его начало:
load_theme_textdomain('themename-theme', get_template_directory() . '/language');
themename-theme - это то, что мы указывали в "__" и "_e".
Вывод вместо поста шести миниатюр первых шести картинок в этом посте
Меняем нечто подобное:
<p><?php the_content(); ?></p>
На:
<p> <?php $szPostContent = $post->post_content; $szSearchPattern = '/<img.+src=\"(.+\.jpg)\".*>/i'; // Запускаем preg_match_all для сохранения всех изображений в $aPics preg_match_all( $szSearchPattern, $szPostContent, $aPics ); // Проверяем на количество $iNumberOfPics = count($aPics[0]); if ( $iNumberOfPics > 0 ) { //Вывод изображения for ( $i=0; (($i < $iNumberOfPics)&&($i < 6)) ; $i++ ) { echo "<img src=\"". $aPics[1][$i] . "\" style=\"height: 100px; margin: 8px;\">"; }; }; ?> </p>
Защита почтовой ссылки
<script language="JavaScript"> var login = 'mymaillog'; var server = 'mydomain.ru'; var email = login+'@'+server; var url = 'mailto:'+email; document.write('<a href="'+url+'">'+email+'</a>'); </script>
Шорткоды
Вызов коротких вставок прямо из текста блога. Оформляется в квадратных скобках:
[mailto]E-mail[/mailto]
Результатом может служить например такой кусок кода в html:
<p class="email"> <script language="JavaScript"> var login = \''.$email_name.'\'; var server = \''.$email_doman.'\'; var email = login+\'@\'+server; var url = \'mailto:\'+email; document.write(\'<a href="\'+url+\'">\'+email+\'</a>\'); </script> </p>
Берем здесь: http://codex.wordpress.org/Shortcode_API
Примеры кода
Пример шорткода поддерживающий вложение других шорткодов (этот вкладывать нельзя) Этот шорткод выводит содержимое в зависимости от времени в требуемом часовом поясе.
//[time_show_shortcode hour_start="9" hour_stop="10"]My block[/time_show_shortcode] function time_show_shortcode_func( $atts, $content = null ) { extract( shortcode_atts( array( 'hour_start' => , 'hour_stop' => , ), $atts ) ); //один из параметров не задан if ( $hour_start == "" || $hour_stop=="" ) { return ; } //Переменные в цыйфры $hour_start=(int)$hour_start; $hour_stop=(int)$hour_stop; //Получаем текущий час date_default_timezone_set('Asia/Novosibirsk'); $hour = date('G'); //час начала периода меньше или равен часу окончания if ( ( $hour_start <= $hour_stop ) && ( $hour_start <= $hour && $hour <= $hour_stop ) ) { return do_shortcode($content); } //час начала периода больше или равен часу окончания (например 23 - 4) if ( ( $hour_start > $hour_stop ) && ( $hour_start <= $hour || $hour <= $hour_stop ) ) { return do_shortcode($content); } return ; } add_shortcode( 'time_show_shortcode', 'time_show_shortcode_func' );
Восстановление пароля
Flash перекрывает элементы страницы (фото, меню...)
Решение:
Было:
<object style="height: 390px; width: 640px"> <param name="movie" value="http://www.youtube.com/v/4diwpZmc0bU"> <param name="allowFullScreen" value="true"> <param name="allowScriptAccess" value="always"> <embed src="http://www.youtube.com/v/4diwpZmc0bU" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="360"> </object>
Надо поменять:
<object style="height: 390px; width: 640px"> <param name="wmode" value="opaque"> <param name="movie" value="http://www.youtube.com/v/4diwpZmc0bU"> <param name="allowFullScreen" value="true"> <param name="allowScriptAccess" value="always"> <embed wmode="opaque" src="http://www.youtube.com/v/4diwpZmc0bU" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="360"> </object>
Оптимизация
Hyper Cache
Используйте плагин Hyper Cache, очень ускоряет работу WP
Для того что бы ускорить работу плагина с IIS надо добавить в "Кэширование выводимых данных":
Расширение имени файла: .dat Кэширование в режиме пользователя x Кэширование в режиме ядра x
Использование функции Flush НЕ ДЕЛАЙТЕ ТАК НЕ РАБОТАЕТ КЭШ ПЛАГИНЫ
При обращении пользователя к сайту, конечному серверу время, чтобы полностью загрузить страницу. Все это время окно браузера остается пустым, ожидая получения информации. В PHP имеется функция flush(), которая позволяет загружать полученную с сервера информацию по частям, и она постепенно будет отображаться в окне браузера, пока остальная информация все еще загружается с сервера. Это особенно актуально для сильно загруженных конечных серверов или сложного интерфейса.
Размещать эту функцию лучше всего сразу после HEAD, так как HTML-контент заголовка обычно легче всего открыть, кроме того, в него можно добавить файлы CSS и JavaScript, которые будут загружаться параллельно с остальным контентом страницы.
Пример:
... </head> <?php flush(); ?> <body> ...
Проведенные Yahoo! исследования демонстрируют высокую эффективность данного метода оптимизации.
Количество запросов к базе
В footer.php добавить:
<?php echo get_num_queries(); ?> queries in <?php timer_stop(1); ?> seconds. </body>
Поиск по страницам
Находим в файле search.php темы строки вида:
$args=array( 'post_type' => array('post','news', 'media'), 's' => $s, 'post_status' => 'publish', 'paged' => $paged );
Перед:
$wp_query = new WP_Query($args);
И меняем на:
$args=array( 'post_type' => array('page', 'post','news', 'media'), 's' => $s, 'post_status' => 'publish', 'paged' => $paged );
Карта сайта
Плагин Dagon Design Sitemap Generator берем здесь.
вставляем в страницу карты сайта:
<!-- ddsitemapgen -->
Если надо вставить в шаблон то:
<?php echo ddsg_create_sitemap(); ?>
Решение конфликта Dagon Design Sitemap Generator и qTranslate
Меняем в файле sitemap-generator/sitemap-generator.php строку:
$the_title = htmlspecialchars(trim($page_data[$p]['title']));
на
$the_title = htmlspecialchars(trim(__($page_data[$p]['title'])));
а строку:
$the_title = htmlspecialchars(trim($post_data[$p]['title']));
на
$the_title = htmlspecialchars(trim(__($post_data[$p]['title'])));
Убираем часть html кода для IE
В связи с тем, что у IE есть проблемы с определенным кодом, или скриптами, можно убрать часть html именно для IE.
Например уберем для IE6 надпись:
<!--[if gt IE 6]><!--> IE6 - отстой! <!-- <![endif]-->
Для всех версий IE:
<!--[if !IE]><!--> Все IE - отстой! <!-- <![endif]-->
Число ревизий (редакций)
Для запрета создания ревизий в файл wp-config.php добавляем:
define('WP_POST_REVISIONS', false);
Если нужно просто изменить их количество (по умолчанию 25) в файл wp-config.php добавляем:
define('WP_POST_REVISIONS', 3);
Allow Javascript in Posts and Pages
Никаких настроек в плагине нет. Чтобы вставить нужный javascript в запись достаточно заключить текст этого скрипта в теги [js] и [/js] в место <script type="text/javascript"> и </script>.
Пример:
[js] function time() { var time=new Date(); document.clock.date.value=time.toLocaleString(); setTimeout('fulltime()',500) } time(); [/js]
Голосование плагин WP-Polls
В текущей версии 2.64 не работает с Hyper Cache, решение не очень красивое, но работает. В файле wp-polls/wp-polls.php ищем строки :
// Display Poll Voting Form
$temp_pollvote .= "
и добавляем
$temp_pollvote .= "<a href=\"#ViewPollResults\" onload=\"poll_result(".$poll_question_id."); return false;\"></a>\n";
Тем самым заставляем в любом случае показать режим голосования
И еще ищем
} else { printf(__('You Had Already Voted For This Poll. Poll ID #%s', 'wp-polls'), $poll_id);
и меняем на
} else { echo display_pollresult($poll_id, 0, false);
В случае если человек голосовал, то просто выводим результаты
Также убираем кусок кода
// Verify Referer /* if(!check_ajax_referer('poll_'.$poll_id.'-nonce', 'poll_'.$poll_id.'_nonce', false)) { _e('Failed To Verify Referrer', 'wp-polls'); exit(); } */
Отключение скрипта wp-cron.php
Бывает, что встроенный cron дает большую нагрузку, если вы его не используете, то можно его отключить добавив в файл wp-config.php строку:
define(‘DISABLE_WP_CRON’, true);
Javascript и jQuery
Подключение своего js скрипта
Если скрипт зависит от других скриптов. Читать тут. А тут еще примеры.
Мой пример:
#Подключаем скрипт масштабирования карты function rwdImageMaps_enqueue_scripts(){ if ( is_home() ) { wp_register_script( 'rwdImageMaps', get_template_directory_uri() . '/js/jquery.rwdImageMaps.min.js', array( 'jquery' ), '1.10', true ); wp_enqueue_script( 'rwdImageMaps' ); } } add_action('wp_enqueue_scripts', 'rwdImageMaps_enqueue_scripts');
Вкратце:
- is_home() - этот нужен только на главной. Можно is_single(), is_admin() и т.д. можно использовать отрицание !is_admin() не в админке.
- rwdImageMaps - имя которое мы присваиваем скрипту
- get_template_directory_uri() . '/js/jquery.rwdImageMaps.min.js' - путь до скрипта
- array( 'jquery' ) - массив скриптов от которых зависит этот скрипт (здесь от jquery)
- 1.10 - текущая версия скрипта
- true - поместить скрипт в footer, если false то в header.
Uncaught TypeError: undefined is not a function
После обновления jQuery стала появляться ошибка в скриптах:
Uncaught TypeError: undefined is not a function
Поменялся синтаксис, решение, конструкцию вида:
$(document).ready(function () {
меняем на:
jQuery(document).ready(function () {
меняем везде.
Еще вариант, в начале скрипта добавляем:
var $=jQuery.noConflict();
Передача переменных из WP скрипту
Например надо передать путь темы, в function.php:
wp_register_script( 'my-script', 'myscript_url' ); wp_enqueue_script( 'my-script' ); $translation_array = array( 'templateUrl' => get_stylesheet_directory_uri() ); //after wp_enqueue_script wp_localize_script( 'my-script', 'object_name', $translation_array );
В скрипте можно использовать:
var templateUrl = object_name.templateUrl;
Глюки IE8
Выяснился забавный глюк IE8 слетали горизонтальные меню и были другие проблемы в верстке когда в html-документе в начале первой строки перед
<!DOCTYPE html>
были непечатаемые символы которые нигде не было видно. IE8 не ругался, просто работал некорректно.
Оказалось, что символы случайно были в начале php-файла подключаемого через functions.php. Символы были до <?php Очень долго искал :)
Strict Standards: Declaration of ... should be compatible with ..
Обновил WP и вылезла ошибка "Strict standards: Declaration of topmenu_walker::start_el() should be compatible with Walker_Nav_Menu"
Ищем в теме строку:
function start_el(&$output, $item, $depth, $args)
меняем на:
function start_el(&$output, $item, $depth = 0, $args = array(), $id = 0)
А строку
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args);
меняем на:
$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args, $id );
Нашел на форуме.
Плагины безопасности
- Самый простой плагин контроля изменения файлов WordPress File Monitor
- Ограничение попыток авторизации Limit Login Attempts
Видео
Для вставки видео используем шорткод:
[video width="480" height="270" poster="/wp-content/uploads/preview-480x270.jpg" mp4="/wp-content/uploads/video.mp4"][/video]
Видео файл должен быть на сервере.
Ошибки
WP может обновится или поставить тему и т.п. требует логин пароль FTP. Решаем:
Для начала попробуем запретить использовать ftp, в файл wp-config.php добавим:
/** no ftp updating plugins*/ define('FS_METHOD', 'direct');
пробуем, и видим ошибку:
An error occurred while updating twentythirteen: Download failed. Could not open handle for fopen() to /tmp/twentythirteen.1.6.tmp
Видим, что нас хостинг не пускает в свою /tmp директорию, ок поменяем на свою, для этого добавим строки, убрав строики из предыдущего примера:
/** Зададим tmp дерикторию */ define( 'WP_TEMP_DIR' , ABSPATH . 'wp-content/tmp/' );
Создаем на хостинге директорию:
wp-content/tmp/
Наслаждаемся :)
Ошибка js Uncaught Error: Syntax error, unrecognized expression: a[href^=#]
После обновления jQuery до версии 1.12.3 (WordPress 4.5) Перестали работать Tabs и появилась ошибка: Uncaught Error: Syntax error, unrecognized expression: a[href^=#]
Как выяснилось поменялся синтаксис и теперь в место $('a[href^=http://]') надо использовать $('a[href^="http://"]')
Так как у меня в теме используется jquery.tools.min.js (jQuery Tools v1.2.6), то нашел и заменил следующие строки:
panes.find("a[href^=#]").unbind("click.T");
Заменил на
panes.find('a[href^="#"]').unbind("click.T");
а
panes.find("a[href^=#]").bind("click.T", function (e) {
на
panes.find('a[href^="#"]').bind("click.T", function (e) {
Все заработало.