Разработка

HOWTO Пинг яндекса и прочих ПС на Drupal 7

Здравствуйте уважаемые!

Прочитав статью о пользе пинга статей, решил настроить пинг на 7-ке, оказалось, модуль multiping еще не портирован, а тот вариант, который на орге предложил andypost не пингует при посте статьи. Ждать не хотелось, решил написать свой сниппет для rules.

Ближе к телу.
Устанавливаем rules, создаем правило по событию Before saving content, в Conditions можете настроить все, что заблагорассудится.
В Actions добавляем Execute custom PHP code и вставляем следующий сниппет:

global $base_url, $base_path;
 
$url = $base_url . $base_path . drupal_get_path_alias('node/' . $node->nid);
 
$services = array(
  'http://ping.blogs.yandex.ru/RPC2',
  'http://blogsearch.google.com/ping/RPC2',
  'http://rpc.pingomatic.com',  
  'http://xping.pubsub.com/ping/',
  'http://rpc.weblogs.com/RPC2',
  'http://blogpeople.net/servlet/weblogUpdates',
);
 
foreach($services as $service){
  $ping = xmlrpc($service,  array('weblogUpdates.ping' => array($node->title, $url)));
 
  if (!$ping)
    watchdog('ping', 'Error sending ping to "%site_name».', array('%site_name' => $service));
}

Помним о том, что код НЕ ДОЛЖЕН содержать <?php ?>.

Готово! Теперь при каждом создании новой ноды или апдейте существующей мы пингуем 6 самых важных для русскоязычного сайта сервисов.

 
 
05.07.2011 — 10:34

Комментарии (23)

Аватар пользователя petrovnn
06.07.2011 — 18:13
1
 
 

Простые понятные сниппеты мне всегда нравились больше нагроможденных модулей с админкой

Аватар пользователя annya
08.07.2011 — 00:34
3
 
 

Простые понятные сниппеты мне всегда нравились больше нагроможденных модулей с админкой

У Rules далеко непростая админка.

По-моему более простой вариант, чем для одного действия ставить немаленький модуль, просто написать свой хук в модуле. + Вы как-то интересно формируете путь — можно просто использовать опцию absolute функции url().

/**
 * Implementation of hook_node_insert().
 */
function mymodule_node_insert($node) {
  $services = array(
    'http://ping.blogs.yandex.ru/RPC2',
    'http://blogsearch.google.com/ping/RPC2',
    'http://rpc.pingomatic.com',  
    'http://xping.pubsub.com/ping/',
    'http://rpc.weblogs.com/RPC2',
    'http://blogpeople.net/servlet/weblogUpdates',
  );
  foreach($services as $service) {
    $ping = xmlrpc($service,  array('weblogUpdates.ping' => array(check_plain($node->title),  url('node/'.$node->nid, array('absolute' => TRUE)))));   
    if (!$ping) {
      watchdog('ping', 'Error sending ping to %site_name.', array('%site_name' => $service));
    }
  }
}
?>

Аватар пользователя Выдрин А.П.
08.07.2011 — 15:53
0
 
 

Rules конечно не самый легкий модуль, но ведь он делает то же самое, что ваш модуль — он просто выполняет сниппет по хуку. Как я уже писал на д.ру, можно написать модуль, но сейчас нет на это времени.

За абсолютный путь url спасибо, совсем забыл про него :)

Аватар пользователя annya
08.07.2011 — 16:00
1
 
 

В чем проблема этот код вставить в свой модуль? Я практически повторила Ваш код, просто Вы его использовали в Rules, а я в контексте своего модуля. И не придется палить по воробьям из пушек. Поэтому про нехватку времени не очень поняла.

Аватар пользователя Выдрин А.П.
08.07.2011 — 20:01
0
 
 

Если честно, не могу понять что именно вы сейчас пытаетесь доказать? Что вы можете написать модуль, так напишите. Мне вот модуль из одного хука писать стыдно не хочется, а закладывать в него некий серьезный функционал некогда.
Сниппет был написан, как некий вариант переждать, пока не выйдет multiping для 7.

Аватар пользователя annya
09.07.2011 — 00:10
0
 
 

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

Аватар пользователя andypost
12.07.2011 — 12:40
-1
 
 

Очень вероятно что в 7ке node-hook можно прямо из темы вызывать, только не забыть почистить кеш cache_bootstrap

Аватар пользователя Выдрин А.П.
12.07.2011 — 15:54
0
 
 

Ясно.
Энди, а что там с мультипингом? Он скорее мертв или скорее жив?

Аватар пользователя andypost
18.07.2011 — 23:12
-1
 
 

пока мёртв, наверно

Аватар пользователя kostin
18.07.2011 — 13:29
0
 
 

Для временного решения проблемы весной сделал вот это: http://drupal.org/project/simpleping (который пингует при создании и сохранении ноды).

Аватар пользователя annya
18.07.2011 — 17:34
1
 
 

У меня какбы замечания есть:
1. function simpleping_install() в файле simpleping.module зачем? Для это существуют .install-файл
2. simpleping_node_insert($node) simpleping_node_update($node), пинг идет, без каких-либо условий. А если на эту ноду анонимусу вход запрещен, зачем пинг слать? Бот попадет на 403.
3.

 <?php global $base_url;
  $url = $base_url . base_path() . drupal_get_path_alias('node/'.$node->nid); ?> 

Функция url() должна формировать пути.

Последнее не как замечание, а как альтернативный вариант использования: использовать PDO-синтаксис в запросах к бд.

Аватар пользователя kostin
18.07.2011 — 17:43
0
 
 

Спасибо, постараюсь всё учесть и допилить. Я-то сам это делал на коленке именно из соображений «что-то надо использовать, пока multiping для семёрки не готов».

Но за такое ревью — спасибо огромное. Думаю, всем начинающим разработчикам не хватает подобной конкретной помощи, с чёткими указаниями на то, как надо.

Аватар пользователя Выдрин А.П.
19.07.2011 — 11:15
0
 
 

Алексей, именно из вашего модуля я скопипастил сам момент пинга )

Аватар пользователя kostin
19.07.2011 — 11:29
0
 
 

Отлично, это же опенсоурс :-)

Аватар пользователя Выдрин А.П.
19.07.2011 — 11:16
0
 
 

На выходных написал-таки полноценный модуль для 7-ки. Осталось причесать код и можно выкладывать.

Аватар пользователя kostin
19.07.2011 — 11:32
0
 
 

А у вас в модуле будет тот нюанс, который подсказала выше annya? Про то, что хорошо бы проверять через node_access есть ли анонимов доступ к ноде, прежде, чем слать пинг.

Если да, то мой модуль уже точно не нужен. Как зарелизитесь — дайте ссылку на ваш модуль, сошлюсь на него со странички simpleping и его уже не стану допиливать.

Аватар пользователя Выдрин А.П.
19.07.2011 — 12:46
0
 
 

Да, пинг будет слаться только на опубликованные ноды.

Для начала планирую выложить на суд общественности здесь и на д.ру. На выходных пытался понять как на орге работать с git'ом, не понял пока :)

Аватар пользователя kostin
19.07.2011 — 13:06
0
 
 

Лучшее русскоязычное пособие по GIT`у: http://githowto.com/ Оно, правда, гораздо объёмнее, чем требуется для д.орг, а для последнего достаточно внимательного просмотра скринкаста: http://vimeo.com/20459209 (не по-русски).

Аватар пользователя kostin
19.07.2011 — 13:08
0
 
 

Кроме опубликованности annya резонно предложила ещё проверять, доступна ли нода анонимусам (в данном случае, поисковым ботам). Ведь может быть такое, что нода опубликована, но доступна только определенным ролям.

Аватар пользователя Выдрин А.П.
19.07.2011 — 13:32
0
 
 

Знаете способ такой проверки? Я нет.
За GIT спасибо! Буду смотреть.

Аватар пользователя xandeadx
04.08.2011 — 14:02
0
 
 

а пинг до http://blogsearch.google.com/ping/RPC2 таким образом работает? в доках сказано что нужно использовать метод weblogUpdates.extendedPing а не weblogUpdates.ping

Аватар пользователя Выдрин А.П.
04.08.2011 — 14:55
1
 
 

Попробовал:

$ping = xmlrpc('http://blogsearch.google.com/ping/RPC2',  array(
  'weblogUpdates.ping' => array(
    'Some title',
    'http://www.site.ru/node/1',
    )
  )
);
dsm($ping);

Результат:
flerror — FALSE
message — Thanks for the ping.

Видимо гугл можно пинговать различными способами.

Аватар пользователя Выдрин А.П.
06.08.2011 — 10:51
0