Исправляем Event Calendar 3.1.1 RC3 своими руками

"SQL, батенька, это вам не шалам-балам"

По долгу работы пришлось столкнуться в жизни с плагином Event Calendar. Скажу честно: если бы не жёсткий дедлайн, я бы не стал пытаться исправлять его и затачивать напильником под конкретные нужды, быстрее было бы переписать. Причина, по которой я не хотел бы его использовать —  не вышел из стадии RC3 с конца октября прошлого (2007) года и имеет одиннадцать открытых багов в багтрекере.

Сегодня я расскажу о такой интересной ошибке как "Unknown column 'wp_posts.ec3_sch.start' in 'order clause'".

Event Calendar 3.1.1RC3 SQL bug

Столкнувшись с проблемой, я начал грешить на плагин Disclose Secret, который, как я знал, также переписывает регулярными выражениями запросы . Как оказалось впоследствии, я был не прав: проблема была в функции ec3_filter_posts_orderby:

[-]
View Code PHP
function ec3_filter_posts_orderby(&$orderby)
{
  global $ec3;
  $regexp='/\bpost_date\b( DESC\b| ASC\b)?/i';
  if($ec3->order_by_start && preg_match($regexp,$orderby,$match))
  {
    if($match[1] && $match[1]==' DESC')
      $orderby=preg_replace($regexp,'ec3_sch.start',$orderby);
    else
      $orderby=preg_replace($regexp,'ec3_sch.start DESC',$orderby);
  }
  return $orderby;
}

Более конкретно — в регулярном выражении в строке $regexp='/\bpost_date\b( DESC\b| ASC\b)?/i';.

Если посмотреть на код запроса:

[-]
View Code MySQL
SELECT SQL_CALC_FOUND_ROWS wp_posts.*
    FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
        INNER JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id)
        LEFT JOIN wp_ec3_schedule ec3_sch ON ec3_sch.post_id=id AND ec3_sch.end>='2008-08-28 00:00:00'
    WHERE
        1=1 AND
        wp_term_taxonomy.taxonomy = 'category' AND
        wp_term_taxonomy.term_id IN ('3') AND
        wp_posts.post_type = 'post' AND
        (wp_posts.post_status = 'publish') AND
        ec3_sch.post_id IS NOT NULL
    GROUP BY wp_posts.ID
    ORDER BY wp_posts.ec3_sch.start
    LIMIT 0, 10

То можно заметить, что вышеприведённое регулярное выражение не учитывает, что в ORDER BY может присутствовать имя таблицы. Если же мы изменим регулярное выражение следующим образом:

[-]
View Code PHP
  $regexp='/\b(?:[a-z0-9_]*posts\\.)?post_date\b( DESC\b| ASC\b)?/i';

То функция будет работать так, как надо.

По традиции привожу в формате unified diff, решающий эту проблему:

--- eventcalendar3.php.orig 2008-06-13 18:30:56.000000000 +0300
+++ eventcalendar3.php  2008-08-28 22:44:13.000000000 +0300
@@ -240,7 +240,7 @@
 function ec3_filter_posts_orderby(&$orderby)
 {
   global $ec3;
-  $regexp='/\bpost_date\b( DESC\b| ASC\b)?/i';
+  $regexp='/\b(?:[a-z0-9_]*posts\\.)?post_date\b( DESC\b| ASC\b)?/i';
   if($ec3->order_by_start && preg_match($regexp,$orderby,$match))
   {
     if($match[1] && $match[1]==' DESC')

Вложения:

Автор: ; опубликовано в: Патчи; метки: Event Calendar, MySQL, WordPress, патч, плагин
28
Авг
2008

RSS Комментарии к статье «Исправляем Event Calendar 3.1.1 RC3 своими руками»  »

К статье «Исправляем Event Calendar 3.1.1 RC3 своими руками» комментариев пока нет. Не хотите ли стать первым?

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Исправляем Event Calendar 3.1.1 RC3 своими руками»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा