За обновлениями можно следить в telegram-канале https://t.me/quasiart

Дисклеймер

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

Опыт имею и в MODX, и в WordPress, но в силу своих предпочтений опыт с WordPress стараюсь свести к минимуму.

WordPress задумывался как CMS для блогов. Как известно, при владении только молотком всё превращается в гвозди. И если бы люди не пытались делать на WordPress сайты абсолютно разной направленности (социальные сети, интернет-магазины и так далее), из этой CMS могло бы получиться что-то стоящее.

Работа с БД

WordPress

В WordPress нет никакой абстракции при работе с БД. Есть у них какой-то условный класс для работы с БД, а дальше что? Обернуть спагетти из методов в класс — это не ООП и не гарант хорошей архитектуры. Разработчикам проще использовать встроенные в PHP функции для работы с БД (mysqli_*). Ни намёка на ORM, берущей на себя определённую рутинную работу и улучшающей сопровождабельность кода.

 $querystr = "
    SELECT $wpdb->posts.* 
    FROM $wpdb->posts, $wpdb->postmeta
    WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 
    AND $wpdb->postmeta.meta_key = 'tag' 
    AND $wpdb->postmeta.meta_value = 'email' 
    AND $wpdb->posts.post_status = 'publish' 
    AND $wpdb->posts.post_type = 'post'
    AND $wpdb->posts.post_date < NOW()
    ORDER BY $wpdb->posts.post_date DESC
 ";

 $pageposts = $wpdb->get_results($querystr, OBJECT);

MODX

В MODX дело обстоит гораздо иначе. Когда я программирую под MODX, у меня возникает ощущение, что я общаюсь в чате: MODX, дай мне, пожалуйста, 10 опубликованных постов от пользователя с id=42, отсортированных по дате публикации. И последние комментарии этого пользователя с этими же критериями. Спасибо. . При правильном подходе эти запросы займут около 10 строк красиво отформатированного кода. Всё это возможно благодаря xPDO — ORM, созданная специально для MODX.

// Поступить в Хогвартс (или создать новую школу с таким же названием)
$school = $modx->getObject('School', ['name' => 'Hogwarts']);
if (!$school) {
    $school = $modx->newObject('School');
    $school->set('name', 'Hogwarts');
    $school->save();
}

// Найдите 100 студентов, которые являются выпускниками, и отсортируйте по фамилии
$c = $modx->newQuery('Student');
$c->where([
    'school' => $school->get('id'),
    'is_alumni' => true,
    'start_year' => $_GET['start_year'] ?? date('Y') - 5,
]);
$c->sortby('lastname', 'ASC');
$c->limit(100);

Плагины

Количество — это не качество. Не проводил детальную аналитику, но за время существования обеих CMS в их экосистеме накопилось достаточное количество плагинов для всего спектра задач: вывод данных, электронная коммерция, оптимизация производительности и так далее. Я ни разу не сталкивался с нехваткой дополнений под MODX. К тому же, для каких-то задач не требуются дополнения, так как определённые вещи есть в MODX по определению (by design, так сказать).

Оценить количество дополнений для MODX можно оценить здесь: https://extras.modx.com/browse

Темы

WordPress

Тема состоит из множества php-файлов. Малейшая ошибка — и ты ошибся.

<?php if ($pageposts): ?>
 <?php global $post; ?>
 <?php foreach ($pageposts as $post): ?>
 <?php setup_postdata($post); ?>
 
 <div class="post" id="post-<?php the_ID(); ?>">
 <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>">
    <?php the_title(); ?></a></h2>
    <small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
    <div class="entry">
       <?php the_content('Read the rest of this entry »'); ?>
    </div>
    <p class="postmetadata">Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?>  
    <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>
 </div>
 <?php endforeach; ?>
 <?php else : ?>
    <h2 class="center">Not Found</h2>
    <p class="center">Sorry, but you are looking for something that isn't here.</p>
    <?php include (TEMPLATEPATH . "/searchform.php"); ?>
 <?php endif; ?>

MODX

Используется встроенный лаконичный шаблонизатор, ну а под капотом живёт популярный шаблонизатор — Smarty. А эта лаконичность подхода подталкивает к такой же лаконичной и надёжной разработке.

<!DOCTYPE html>
<html lang="ru">
[[$Head]]
<body itemscope itemtype="http://schema.org/WebPage">
  <div class="page-container">
    <div class="navigation">
      [[$Navigation]]
      <div class="container">
      	<div class="row">
      	  <div class="col s12 m12 l8">
      	    <header class="page-header">
      	      [[$ArticleHeader]]
              [[$Breadcrumbs]]
            </header>
            <article itemscope itemtype="http://schema.org/Article" class="article">
              [[*content]]
            </article>
      	  </div>
          <aside class="col s12 m12 l4" role="complementary" itemscope itemtype="http://schema.org/WPSideBar">
            [[$ArticleSidebar]]
          </aside>
        </div>
      </div>
    </div>
    [[$Footer]]
  </div>
</body>
</html>

Вывод

Не так и много, но это всё, что накопилось при контакте с WordPress.