WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Ajax в WordPress

Цель этой статьи показать, как использовать AJAX при создании тем и плагинов.

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

AJAX Simply - мой плагин для удобного создания AJAX запросов. Использовать AJAX станет проще в несколько раз!

Видео уроки об AJAX в WordPress:

AJAX в админ-панели WordPress

С тех пор, как AJAX был встроен в админ-панель WP, использовать функционал AJAX в плагинах стало очень удобно. Небольшой пример. Все делается в одном файле (файле плагина или файле темы functions.php).

#1. Добавляем javascript

Сначала добавляем на страницу админки javascript код, который будет посылать AJAX запрос.

<?php
//add_action('admin_print_scripts', 'my_action_javascript'); // такое подключение будет работать не всегда
add_action('admin_print_footer_scripts', 'my_action_javascript', 99);
function my_action_javascript() {
	?>
	<script>
	jQuery(document).ready(function($) {
		var data = {
			action: 'my_action',
			whatever: 1234
		};

		// с версии 2.8 'ajaxurl' всегда определен в админке
		jQuery.post( ajaxurl, data, function(response) {
			alert('Получено с сервера: ' + response);
		});
	});
	</script>
	<?php
}
?>

С версии 2.8 javascript переменная ajaxurl определена глобально на всех страницах админки. Используйте её в js коде, как ссылку на файл обработчик AJAX запроса. Обычно это файл /wp-admin/admin-ajax.php. В теме (шаблоне) эта переменная не определена. Чтобы использовать её во фронт-энде, её нужно определить самостоятельно. Как это сделать смотрите ниже.

#2. Создаем PHP функцию

Теперь, создадим PHP функцию, которая будет обрабатывать переданный AJAX запрос. Для этого добавляем следующий код в functions.php (можно в плагин):

add_action( 'wp_ajax_my_action', 'my_action_callback' );
function my_action_callback() {
	$whatever = intval( $_POST['whatever'] );

	$whatever += 10;
	echo $whatever;

	wp_die(); // выход нужен для того, чтобы в ответе не было ничего лишнего, только то что возвращает функция
}

Тут мы цепляемся на хук wp_ajax_my_action - это динамический хук и выглядит он так: wp_ajax_(action), где вместо (action) вставляется значение переменной передаваемой в первом коде: action = my_action.

Вот и все.

Примера выше достаточно, чтобы начать использовать AJAX в админ-панели WordPress.

По возможности всегда используйте wp_die() вместо die() или exit(), в функции обработки AJAX запроса. Так вы добьетесь лучшей интеграции с WordPress и в случае ошибок в коде, получите данные о них.

меню

AJAX во внешней части WordPress

Первое в чем нужно убедиться - установлена ли на сайте библиотека jQuery.

Во фронт-энде (внешней части сайта) нужно использовать еще один хук для обработки AJAX запросов: wp_ajax_nopriv_(action). Этот хук в отличии от wp_ajax_(action), срабатывает для неавторизованных пользователей.

Т.е. чтобы создать обработчик запроса для всех пользователей: авторизованных и нет, PHP функцию нужно прикреплять сразу к двум хукам:

add_action('wp_ajax_(action)', 'my_action_callback');
add_action('wp_ajax_nopriv_(action)', 'my_action_callback');

'wp_ajax_nopriv_(action)' можно не указывать, если не нужно, чтобы AJAX запрос обрабатывался для неавторизованных пользователей.

Переменная ajaxurl

Напомню, что переменная ajaxurl есть только в админке и её нет в лицевой части сайта (фронт-энде), поэтому её нужно определить (создать). Но мы назовем её по-другому - myajax.url, для фронта так удобнее, потому что так в объект myajax можно будет добавить еще данные связанные с AJAX запросом.

Правильный способ создать такую переменную - это использовать функцию wp_localize_script().

// Подключаем локализацию в самом конце подключаемых к выводу скриптов, чтобы скрипт
// 'twentyfifteen-script', к которому мы подключаемся, точно был добавлен в очередь на вывод.
// Заметка: код можно вставить в любое место functions.php темы
add_action( 'wp_enqueue_scripts', 'myajax_data', 99 );
function myajax_data(){

	// Первый параметр 'twentyfifteen-script' означает, что код будет прикреплен к скрипту с ID 'twentyfifteen-script'
	// 'twentyfifteen-script' должен быть добавлен в очередь на вывод, иначе WP не поймет куда вставлять код локализации
	// Заметка: обычно этот код нужно добавлять в functions.php в том месте где подключаются скрипты, после указанного скрипта
	wp_localize_script( 'twentyfifteen-script', 'myajax', 
		array(
			'url' => admin_url('admin-ajax.php')
		)
	);  

}

В результате, получим в head части сайта прямо перед скриптом 'twentyfifteen-script':

<script type='text/javascript'>
/* <![CDATA[ */
var myajax = {"url":"http://wptest.ru/wp-admin/admin-ajax.php"};
/* ]]> */
</script>
<script type='text/javascript' src='http://wptest.ru/wp-content/themes/twentyfifteen/js/functions.js?ver=20150330'></script>

На этом теория AJAX закончена, теперь все как для админ части, только вместо ajaxurl указываем myajax.url и нужно прикрепить функцию обработчик на еще один хук wp_ajax_nopriv_(action).

Пример AJAX кода для фронт энда

<?php

add_action( 'wp_enqueue_scripts', 'myajax_data', 99 );
function myajax_data(){

	wp_localize_script('twentyfifteen-script', 'myajax', 
		array(
			'url' => admin_url('admin-ajax.php')
		)
	);  

}

add_action('wp_footer', 'my_action_javascript', 99); // для фронта
function my_action_javascript() {
	?>
	<script type="text/javascript" >
	jQuery(document).ready(function($) {
		var data = {
			action: 'my_action',
			whatever: 1234
		};

		// 'ajaxurl' не определена во фронте, поэтому мы добавили её аналог с помощью wp_localize_script()
		jQuery.post( myajax.url, data, function(response) {
			alert('Получено с сервера: ' + response);
		});
	});
	</script>
	<?php
}

add_action('wp_ajax_my_action', 'my_action_callback');
add_action('wp_ajax_nopriv_my_action', 'my_action_callback');
function my_action_callback() {
	$whatever = intval( $_POST['whatever'] );

	echo $whatever + 10;

	// выход нужен для того, чтобы в ответе не было ничего лишнего, только то что возвращает функция
	wp_die();
}

Код рассчитан на тему twentyfifteen. Вставлять код можно в functions.php темы.

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

меню

Логичное подключение AJAX хуков

Я не стал усложнять чтение и не говорил, как правильно подключать AJAX через хуки в коде. Впрочем все что написано ниже не обязательно, потому что работать будет и так, но это рекомендуется.

Функции обработчики установленные хукам:

  • wp_ajax_(action)
  • wp_ajax_nopriv_(action) 

Оба хука всегда удовлетворяют условию wp_doing_ajax():

if( wp_doing_ajax() ){}

// до версии WP 4.7 
if( defined('DOING_AJAX') ){}

А значит сами хуки нужно подключать, только если срабатывает это условие.

Используя это правило, можно не подключать хуки там где в этом нет смысла. Например, при генерации страницы шаблона или страницы админки. Эта маленькая деталь добавит больше логики в код и в некоторых случаях может избавить от багов.

Пример того, как рекомендуется подключать все AJAX хуки.

// подключаем AJAX обработчики, только когда в этом есть смысл
if( wp_doing_ajax() ){
	add_action('wp_ajax_myaction', 'ajax_handler');
	add_action('wp_ajax_nopriv_myaction', 'ajax_handler');
}

// или так до WP 4.7
if( defined('DOING_AJAX') ){
	add_action('wp_ajax_myaction', 'ajax_handler');
	add_action('wp_ajax_nopriv_myaction', 'ajax_handler');
}

В этом случае хуки будут подключены только во время AJAX запроса и не будут подключены при простом посещении фронта, админки, REST или CRON запросе.

Напомню также, что данные отправляемые с фронтэнда на файл wp-admin/admin-ajax.php обработаются указанной в хуке произвольной функцией ajax_handler(), независимо авторизован пользователь или нет.

меню

Защита: используем nonce и проверяем права

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

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

Существует два вида защиты, которые нужно использовать в AJAX запросах в большинстве случаев.

1. Код nonce (случайный код)

Nonce - это уникальная строка, которая создается и используется один раз - одноразовое число. Nonce проверка используется, когда нужно убедится, что запрос был послан с указанного «места».

В WordPress есть функции wp_create_nonce() и check_ajax_referer() - это базовые функции для создания и последующей проверки nonce кода. С их помощью мы и будем создавать защиту nonce для AJAX запросов.

Для начала создадим nonce код:

add_action( 'wp_enqueue_scripts', 'myajax_data', 99 );
function myajax_data(){

	wp_localize_script('twentyfifteen-script', 'myajax', 
		array(
			'url' => admin_url('admin-ajax.php'),
			'nonce' => wp_create_nonce('myajax-nonce')
		)
	);  

}

twentyfifteen-script это название основного скрипта темы (см. выше), который подключается на сайте с помощью wp_enqueue_script().

Затем, в AJAX запросе добавим переменную с кодом nonce:

var ajaxdata = {
	action     : 'myajax-submit',
	nonce_code : myajax.nonce
};
jQuery.post( myajax.url, ajaxdata, function( response ) {
	alert( response );
});

Теперь, в обработке заброса необходимо проверить nonce код:

add_action( 'wp_ajax_nopriv_myajax-submit', 'myajax_submit' );
add_action( 'wp_ajax_myajax-submit', 'myajax_submit' );
function myajax_submit(){
	// проверяем nonce код, если проверка не пройдена прерываем обработку
	check_ajax_referer( 'myajax-nonce', 'nonce_code' );
	// или так
	if( ! wp_verify_nonce( $_POST['nonce_code'], 'myajax-nonce' ) ) die( 'Stop!');

	// обрабатываем данные и возвращаем
	echo 'Возвращаемые данные';

	// не забываем завершать PHP
	wp_die();
}

check_ajax_referer() работает на основе функции wp_verify_nonce() и по сути является её оберткой для AJAX запросов.

Обратите внимание, что в данном случае Nonce код создается в HTML коде. А это значит, что если у вас установлен плагин страничного кэширования, то этот код может и наверняка будет устаревать к моменту очередного AJAX запроса, потому что HTML код кэшируется...

2. Проверка прав доступа

Тут AJAX запросы будут срабатывать только для пользователей с правом указанным правом, например author. Для всех остальных, включая неавторизованных пользователей, AJAX запрос вернет ошибку.

Особенность тут в том, что не авторизованные пользователи тоже должны видеть сообщение об ошибке при AJAX запросе. Поэтому для них тоже нужно обрабатывать запрос и вернуть сообщение об ошибке:

add_action( 'wp_ajax_nopriv_myajax-submit', 'myajax_submit' );
add_action( 'wp_ajax_myajax-submit', 'myajax_submit' );
function myajax_submit(){
	// проверяем nonce код, если проверка не пройдена прерываем обработку
	check_ajax_referer( 'myajax-nonce', 'nonce_code' );

	// текущий пользователь не имеет права автора или выше
	if( ! current_user_can('publish_posts') )
		die('Этот запрос доступен пользователям с правом автора или выше.')

	// ОК. У юзера есть нужные права!

	// Делаем что нужно и выводим данные на экран, чтобы вернуть их скрипту

	// Не забываем выходить
	wp_die();
}
меню

Включаем кэширование для AJAX запросов

По умолчанию все AJAX запросы НЕ кэшируются браузером для этого PHP устанавливает специальные заголовки функцией nocache_headers().

Чаще всего AJAX запросы кэшировать и не надо, потому что они должны возвращать свежие данные, но бывают случаи когда такое кэширование может сэкономить ресурсы и увеличить скорость работы скрипта. Например, если у нас есть сложный фильтр товаров который юзеры используют постоянно. Тут было бы разумно кэшировать все результаты фильтра например на пару часов, все равно товары не добавляются с такой скоростью...

Как включить кэширование для указанных AJAX запросов смотрите во втором примере функции nocache_headers().

меню

Отлавливаем баги, PHP ошибки

Проблемы могут возникнуть при AJAX запросе и появлении ошибок PHP. Заметки или сообщения могут изменить возвращаемый результат или вызвать ошибку javascript.

Дебаг (вывод ошибок на экран)

Вариант:

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

При этом в коде можно использовать привычные функции print_r() или var_dump(), чтобы увидеть что находится в нужных переменных.

Вариант: включаем показ ошибок в AJAX запросах

WordPress по умолчанию не показывает ошибки для AJAX запросов даже если константа WP_DEBUG включена! Видно это в коде функции wp_debug_mode().

Несмотря на это такой показ можно включить, ведь на рабочих проектах у нас все равно WP_DEBUG отключена и боятся нам нечего, а вот баги выловить это помогает на ура!

Чтобы включить показ ошибок при AJAX запроса, нужно вставить такой код в файл темы functions.php или в плагин. Но лучшее его вставить как можно раньше, чтобы видеть ранние ошибки, лучше всего в MU плагины...

if( WP_DEBUG && WP_DEBUG_DISPLAY && (defined('DOING_AJAX') && DOING_AJAX) ){
	@ ini_set( 'display_errors', 1 );
}

Вариант: вывод данных в лог файл

Если по ходу написания кода нужно заглянуть в переменную $myvar, то еще можно использовать такой код в обработчике ajax запроса:

error_log( print_r($myvar, true) );

В результате, в файл логов сервера (error.log) будет записано содержимое переменной $myvar. Так можно выполнить ajax, и заглянуть в лог.

Вариант: вывод PHP ошибок в лог файл

Чтобы выводить PHP заметки и ошибки в лог файл, нужно включить константу WP_DEBUG_LOG. Такой лог файл появится в папке wp-content.

Вариант:

Если не получается увидеть сообщение об ошибке и нужно работать в режиме разработчика, можно очистить буфер сразу перед возвратом данных:

ob_clean();
echo $whatever;
die();

После этого нужно посмотреть что возвращает запрос через дебаг браузера или как-то еще...

Вариант:

Также, для дебага можно воспользоваться инструментом FirePHP, который записывает ошибки в консоль браузера.

Ошибка при возвращении данных

Если AJAX запрос на в файл wp-admin/admin-ajax.php провалился, то будет возвращен ответ -1 или 0.

  • -1 - ошибка при проверке запроса. См. функцию check_ajax_referer()
  • 0 - обработка запроса вернула пустой результат
  • 0 - также возвращается по умолчанию во всех остальных случаях.

Полезная стать по теме (англ): 5 TIPS FOR USING AJAX IN WORDPRESS

меню

Плагины

Плагин AJAX Simply - добавляет класс, с помощью которого можно удобно и быстро писать AJAX запросы на стороне клиента и ответы на стороне сервера.

Качественный и надежный сервис по продвижению в Телеграмме предлагает совершить недорогую покупку подписчиков в группу. На сайте Вы найдете массу выгодных предложений с индивидуальными условиями для каждого сообщества. Например, Вы можете выбрать оптимальную скорость поступления ресурса, которая доходит до 1000 единиц в сутки. Успейте сделать заказ, пока на сайте действуют оптовые скидки.

92 коммента
Полезные 10 Вопросы 3 Все
  • jkeks cайт: jkeks.ru

    Взято на заметку, отличный пост.
    Видел я библиотечку одну, она делает такую фигню как использование AJAX запрособ
    без строчки JS кода.. щас поищу
    нашел..

    AJAX без JavaScript:
    http://jkeks.ru/jkeks.ru/archives/3658

    -1
    Ответить6 лет назад #
  • casepress cайт: casepress.org

    ошибка в статье...

    jQuery.post(ajaxurl, data, function(response) {  
    		alert('Got this from the server: ' + response);  
    	});

    должно быть так:

    jQuery.post(myajax.url, data, function(response) {  
    		alert('Got this from the server: ' + response);  
    	});

    Если переменная передается так:

    wp_localize_script( 'jquery', 'myajax',   
    array(  
       'url' => admin_url('admin-ajax.php'),  
       'nonce' => wp_create_nonce('myajax-nonce')  
    ));
    Ответить5.5 лет назад #
  • fewfwe

    жосский сайт, всё есть для создания собственных плагинов smile

    Ответить5.5 лет назад #
  • Игнатенко cайт: rx-name.ua

    Отличная статья! Спасибо автору!

    Ответить5.5 лет назад #
  • Otshelnik-Fm203 cайт: otshelnik-fm.ru

    Тимур - статью завершил ссылкой на "5 советов по использованию аякса в вордпресс". А там первым пунктом указывается что использовать

    require($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');
    • это очень бэд - т.к. весь движок вордпресса загружается вновь.

    С этим я согласен.
    А не можешь на примере /dinamicheskiy-arhiv-bloga-s-ispolzovaniem-jquery-ajax.html - своей статьи о динамическом архиве блока рассказать как её переделать по "правильному"? Думаю что не мне одному интересно будет.

    Я все никак этот новый метод не осилю, хотя с wp-load.php разобрался отлично.

    Ответить5.5 лет назад #
    • Kama7201

      Там не совсем про это говорится. Там просто объясняется что и как:

      1. Что надо указывать по возможности относительный путь, а не абсолютный: ("../../../../wp-load.php"), потому что у некоторых пользователей такой путь может не работать.

      2. Также, что надо стараться не вызывать wp-load.php для создания самого JS файла, потому что для его создания обычно нужна среда WP и опять придется вызывать wp-load.php. Именно поэтому в статье Динамический архив блога с использованием jQuery (Ajax) я встроил JS на страницу, а не создавал отдельный файл.

      П.с. Как вы себе представляете все это, чувствую я как-то иначе

      Ответить5.5 лет назад #
      • Otshelnik-Fm203 cайт: otshelnik-fm.ru

        Спасибо за ответ.

        Но ведь я правильно понимаю, что Ajax использованный через wp-admin/admin-ajax.php создает меньшую нагрузку на сайт и является оптимизированным чем /wp-load.php ?

        Ну и соответственно все те вещи что мы делали раньше с использованием файла обработчика и вписывали вызов /wp-load.php - всё это можно переделать под новый метод?

        Не обязательно же использовать экшены в functions.php - ведь если вывод будет идти на отдельной странице - то можно встроить весь этот код в саму страницу? Страницу фильтра по архивам например.

        Пытаюсь понять, потому как ajax-а на сайте навертел много разного (во внешней части сайта - это и фильтр выбора по меткам, и график кинопремьер по произвольным полям, новые записи сайта с фильтром, запрос к апи другого сайта - причем вот это используется на страницах с отдельной записью и может быть использовано очень часто, ну и делаю страницу профиля - там тоже использую), именно используя файл обработчик с подгрузкой /wp-load.php, а нагрузка вещь которая бьет по карману, поэтому и хочется переделать по правильному.

        Вопросов много назадавал и еще один относящийся к ajax:

        На обычном вызове мы можем в футере использовать для вывода потребляемой памяти код который покажет нам время выполнения, количество запросов к базе и использование памяти. плюс использую плагин WP Tuner для определения узких мест. Но всё это не работает при использовании ajax.

        Как увидеть насколько медленным или быстрым является запрос? Как отлаживать этот механизм

        Ответить5.5 лет назад #
        • Kama7201

          Ajax использованный через wp-admin/admin-ajax.php создает меньшую нагрузку на сайт и является оптимизированным чем /wp-load.php

          Начало файла admin-ajax.php говорит само за себя:

          define( 'DOING_AJAX', true );
          define( 'WP_ADMIN', true );
          
          /** Load WordPress Bootstrap */
          require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );

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

          Не обязательно же использовать экшены в functions.php

          Да, не обязательно.

          именно используя файл обработчик с подгрузкой /wp-load.php,

          От этого думаю не так просто убежать. Мне кажется, если нет необходимости использовать ВП функции и проверку реги пользователей, то можно сделать отдельный файл, который бы подключался к БД, вообще не затрагивая ВП и делать запросы через него. Но это костыль, не очень удобно и не всегда подойдет. Вы не пробовали поискать нечто подобное, может кто-то что-то подобное уже предложил, мне самому интересен такой подход.

          Но всё это не работает при использовании ajax.

          Я не пробовал, что если выводить эту инфу через обработчик: в нем получать данные и их отправлять, чтобы взглянуть что там получается в итоге

          Ответить5.5 лет назад #
          • Otshelnik-Fm203 cайт: otshelnik-fm.ru
            Начало файла admin-ajax.php говорит само за себя:
            - Точно! smile
            Вы не пробовали поискать нечто подобное, может кто-то что-то подобное уже предложил, мне самому интересен такой подход.
            - нет, я не искал. Но думаю что буду искать варианты обхода. Наверное вы правы - в некоторых случаях легче выполнить прямой sql запрос в базу.
            если выводить эту инфу через обработчик: в нем получать данные и их отправлять, чтобы взглянуть что там получается в итоге
            - так и сделал. Работает вывод времени скрипта, память и количество запросов. Жаль конечно что wp tuner там не работает. Но и так наглядно
            Ответить5.4 лет назад #
  • Серый

    Все сделал, все работает, но данные два раза от сервера приходят. Куда копать? Где смотреть

    Ответить5.3 лет назад #
    • Kama7201

      Как вы узнали, что 2 раза? Что именно происходит? Думаю, надо копать в строну правильного ли построен ajax запрос.

      Ответить5.3 лет назад #
      • Серый

        Фаербаг в консоли пишет, что два ответа. Верней, что два запроса. Ответа тоже два. Но уже реши проблему, кажется... я делал сначала wp_enqueue_script() а потом wp_register_script() . Убрал wp_register_script() - все гуд, один запрос, один ответ.

        Ответить5.3 лет назад #
  • Женя

    Приветствую. Однажды уже получал ответ на Вашем сайте, испытаю судьбу и снова smile . Вот есть у меня форма отправки данных и мне необходимо, чтобы по нажатию на кнопку "отправить" пользователь переходил на другую страницу и одновременно с этим введенные пользователем данные в поле ( например, "несколько слов о себе") добавлялось в очередь на модерацию комментариев под статьей. Сложность в том, что я не понимаю каким образом введенное поле попадает именно в комментарии? Где искать файл-обработчик комментариев? Инфы как-то совсем мало, принцип передачи-приема с помощью Ajax в целом понимаю, однако на таком уровне эту задачу решить не могу. Буду благодарен за любую помощь, за любую наводочку в сторону разрешения проблемы.

    Ответить4.9 года назад #
    • Kama7201

      Я не понял вопроса, причем тут аякс? unknw Но попробую ответить, как понял: запишите эту переменную (например, "несколько слов о себе") в, допустим, произвольное поле и если у поста есть это поле выводите сообщение. При принятии комментария, удаляйте это поле.

      Ответить4.9 года назад #
  • Игорь cайт: goldbusinessnet.com

    Здравствуйте, Тимур!

    Не совсем по теме, но проблема связана с использованием javascript. Мне нужно скрыть линки комментаторов с помощью тега SPAN, но оставить их кликабельными. Хотелось бы реализовать это дело на основании вот этого скрипта:

    <script type="text/javascript">function GoTo(link){window.open(link.replace("_","http://"));}</script>

    который я прописал перед закрывающим тегом BODY. А вот дальше дело застопорилось. Как я понимаю, необходимо каким-то образом изменить строчку:

    <?php printf(__('<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link()) ?>

    в FUNCTION.PHP, чтобы связать с функцией GoTo, или я не прав? Подскажите, пожалуйста, решение, заранее благодарю.

    Ответить4.5 года назад #
    • Kama7201

      Вам нужны comment_author_url() и comment_author(). И не понятно выражение link.replace("_","http://"). В общем будет как-то так:

      <?php printf(__('<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link()) ?>

      меняем на

      <cite class="fn" onclick="window.open('<?php comment_author_url() ?>');"><?php comment_author() ?></cite>

      То что вы вставили под body удалите - это не нужно.

      Ответить4.4 года назад #
      • @ Мария

        Доброе утро, Тимур! только Ваш комментарий помог мне оформить линки комментаторов с помощью тега span из всего интернета thank_you . Спасибо!
        И у меня к вам вопрос, т.к. у самой не получилось: метки к статьям (tag) можно выводить также через span и onclick, т.е. чтобы они не были ссылками? У меня они выводятся вот так:

        <div><?php if(get_the_tags()) { ?> <?php the_tags('Метки:', ', '); } ?></div>

        Заранее спасибо.

        Ответить4.4 года назад #
        • Kama7201

          Зачем нужна проверка if(get_the_tags()), она внутри функции есть? И еще мне интересно услышать, зачем нужно делать ссылки на метки не ссылками?

          А сделать это можно так:

          $tag_list = get_the_tag_list('<div>Метки:', ', ', '</div>');
          if( $tag_list ){
          	$tag_list = str_replace('a', 'span', $tag_list );
          	$tag_list = preg_replace('~href=["\']([^"\'])["\']~', 'onclick="window.open(\'\\1\');"', $tag_list );
          	echo $tag_list;
          }
          Ответить4.4 года назад #
          • @ Мария

            Тимур, я не сильна в php, поэтому на первый вопрос я не могу ответить вразумительно unknw . Так прописано в шаблоне темы, которая установлена на моем сайте.
            А вот почему я к ним прицепилась, сказать могу, надеюсь вразумительно )
            Практически все рекомендуют убирать метки с сайта вообще, другие закрывать их nofollow + недавно прочитала статью про статический вес страницы, из которой поняла, что если ставить nofollow, то вес страницы улетучивается в никуда. а т.к. метки я решила оставить, то, чтобы вес страницы на них не перетекал и тем более не улетучивался в никуда - я решила сделать их не ссылками. ну как-то так.

            Ответить4.4 года назад #
          • @ Мария

            sorry а куда это надо вставить или как? метки у меня выводятся в конце статьи (single.php), то что заключено у меня в div. я вставляю твой вариант в single.php - этот код отображается в конце статьи. вставила в functions.php - никаких изменений не произошло.

            Ответить4.4 года назад #
            • Kama7201

              Этим кодом нужно заменить ваш код (вместе с div, я див внутрь сунул). Только он должен быть внутри <?php ?>:

              <?php
              $tag_list = get_the_tag_list('<div>Метки:', ', ', '</div>');
              if( $tag_list ){
              	$tag_list = str_replace('a', 'span', $tag_list );
              	$tag_list = preg_replace('~href=["\']([^"\'])["\']~', 'onclick="window.open(\'\\1\');"', $tag_list );
              	echo $tag_list;
              }
              ?>
              Ответить4.4 года назад #
  • @ Игорь Черноморец cайт: igorchernomoretz.com

    Здравствуйте! Может сможете помочь?Буду вам безмерно благодарен!
    В инструментах для вебмастеров от Гугла у меня появилась ошибка сканирования 404 одной ссылки, вот она - igorchernomoretz.com/wp-admin/admin-ajax.php
    То есть гугл утверждает что страница с указанным адресом отсутствует, а сервер не возвращает код ошибки 404 (файл не найден).
    Не совсем пойму как это вдруг произошло, хотя может это из-за обновление вордпресса на версию 4.0, но я обновил вордпресс вчера, а ошибка обнаружена гуглом 28.08.14
    Есть какие-то идеи? Заранее вам благодарен!!!!!

    Ответить4.3 года назад #
    • qazomard cайт: www.aktv.ru

      Вам нужно волноваться, почему гугл вобще нашел этот файл и включил в индекс.

      Тоесть у вас где-то код, который работает с admin-ajax.php вне админки.

      Ищите дыру.

      А 404 правильно отдаёт. Т.к. бот - не админ: он не имеет доступа к админке.

      1
      Ответить4.3 года назад #
      • @ Игорь Черноморец cайт: igorchernomoretz.com

        Спасибо за ответ! Но если честно не совсем понял! От куда у меня мог появиться этот код? За последний месяц никаких кодов не добавлял, только лишь пару плагинов! Есть шанс, что этому коду способствует один из плагинов?

        Ответить4.3 года назад #
    • Kama7201

      Любой плагин, который использует AJAX в лицевой части может добавлять ссылку на admin-ajax.php как переменная javascript. Каким образом такая ссылка попадает в выдачу Google не понятно. Надо спросить у гугла. Что вам делать сказать сложно. Возможно ничего, Гугл должен выплюнуть эту ссылку, так как она выдает 404 ошибку...

      Еще можно попробовать в robots.txt прописать правило Disallow: *admin-ajax.php

      Ответить4.3 года назад #
      • @ Игорь Черноморец cайт: igorchernomoretz.com

        Так в этом то и проблема, что ссылка не даёт ошибку 404! Именно это и написал гугл, что сервер не отдаёт ошибку 404! В любом случае, большое вам спасибо! я спрошу у гугл как такое может быть и... скорей всего добавлю правило в robots об этом я как-то не подумал!
        Ещё раз спасибо

        1
        Ответить4.3 года назад #
  • Артем

    К вопросу об AJAX. У вас на сайте в разделе ’функции’ прекрасно реализован ее предварительный просмотр в модальном окне. Подскажите в какую сторону капать, для реализации подобного функционала?

    Ответить4.1 года назад #
    • Kama7201

      Сложно сказать, в сторону jQuery и AJAX в WordPress pardon Я правда не знаю...

      Ответить4.1 года назад #
Здравствуйте, !     Войти . Зарегистрироваться