WP фишки

Материал из rrv-wiki
Перейти к навигации Перейти к поиску


Содержание

Ключи безопасности

Поменять ключи безопасности в файле 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' );

Восстановление пароля

http://codex.wordpress.org/%D0%A7%D0%90%D0%92%D0%9E/%D0%92%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8F

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 .= "

\n";

и добавляем

$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');

Вкратце:

  1. is_home() - этот нужен только на главной. Можно is_single(), is_admin() и т.д. можно использовать отрицание !is_admin() не в админке.
  2. rwdImageMaps - имя которое мы присваиваем скрипту
  3. get_template_directory_uri() . '/js/jquery.rwdImageMaps.min.js' - путь до скрипта
  4. array( 'jquery' ) - массив скриптов от которых зависит этот скрипт (здесь от jquery)
  5. 1.10 - текущая версия скрипта
  6. 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 скрипту

[1]

Например надо передать путь темы, в 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 );

Нашел на форуме.

Плагины безопасности

  1. Самый простой плагин контроля изменения файлов WordPress File Monitor
  2. Ограничение попыток авторизации 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) {

Все заработало.