Дисклеймер
Не претендую на абсолютную истину, ведь инструменты можно сравнивать только в контексте. Исхожу из собственного опыта, и в этой статье сравниваю 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.