TiA

Рейтинг
116
Регистрация
12.06.2009
mendel:
В том и суть. Функционал вордпресса достаточен для блога. Но чуть дальше и нужно делать надстройки, чтобы вместо 15 символов делать 3 строчки. А вместо 30 символов - 10 строк.

Задачей любой CMS является ускорение разработки. Возможность использования модулей и дополнений - это один из ключевых факторов.

mendel:
Вы находитесь в контексте комментария (кстати как вы там оказались вы так и не сказали, третий раз включаете мороз на вопрос о том как вывести комментарий отдельно), а значит вам для начала нужно получить пост к которому относится этот комментарий. Уже в нем получить ИД таксономии (категории), потом получить эту саму таксономию по ИД, и только в ней получим ИД пользователя.
Дальше уже мы по этому ид получим аватарку.
После чего мы можем уже проверять что она существует, выбирать размер и т.п.

Если вам по какой-то причине для получения фото нужно сначала вывести отдельно комментарий, потом запись к нему, потом рубрику, по рубрике найти автора, а потом уже у него загрузить аватарку, то вы однозначно что-то делаете не так. Давайте посмотрим на ваш код:

<?=$comment->post->category->owner->avatar;?>

Это пример того как не нужно писать код. Вот представьте, что у записи появится возможность выбрать несколько категорий. Как ваш код будет обрабатывать эту ситуацию? А если эти категории будут вложенными, то какую аватарку стоит выдавать? Как ваш код будет обрабатывать ситуацию, если у категории несколько владельцев? Как обрабатывается ситуация, когда у записи комментарии отключены? А если запись связана с другой таксономией, у которой нет владельца? А если в записях, например, изменится связь с категориями и вместо объекта с свойством owner категория вам будет выдавать массив таких объектов? Во всех этих ситуациях код будет выдавать ошибку и создавать проблемы. Они являются следствием сильной связанности сущностей. Вот какое отношение имеет аватарка автора категории к сущности комментария записи из этой категории? Никакого.

<?=$product->manuf->thumb?>

Здесь те же проблемы. Если у продукта не будет указан производитель, то код выдаст ошибку.

mendel:
А вот как сделать саму страничку на которой будет отображаться только он, и ничего больше?
У меня в голове только один хак вырисовывается - в шаблоне поста сделать проверку, есть ли гет-параметр "комментИД", и если он есть, то не выводить шаблон поста, а выводить шаблон комментария.
Ну и дальше уже прямо в шаблоне запрашивать все нужные данные, чего уж, MVC то тут никогда и не было.
Но это бруталити. И поддерживать потом стороннему человеку будет сложно.

А зачем вам куча страниц, на которых выводится по одному комментарию? Вы уверены, что это хорошее решение?

Если требуется получить страницы с отзывами, то можно их выделить в отдельный тип записей и вынести в админку. Это делается через register_post_type. Под новый тип записей создается два шаблона: один для списка, второй для самого отзыва. Добавлять отзывы изначально можно через админку. Можно также сделать небольшую форму и написать небольшой AJAX-обработчик для добавления отзыва через фронтэнд. Использовать для этого комментарии - это, мягко говоря, костыль.

mendel:
это все еще половина от половины) Я не вижу здесь $vendor_id.
Просто вы ведь не под вордпрессом пишете а под ACF а изучать ненужный мне "фреймворк" чтобы написать пример за вас, это уж слишком)

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

Никто ведь не запрещает использовать стандартную функцию get_metadata вместо get_field. В этом случае нужно учесть, что если в дополнительном поле хранится ID изображения, то нужно будет написать дополнительный код для получения объекта изображения с нужными размерами и метаданными. Если хранится расположение на карте, то и его нужно как-то обрабатывать перед выводом. Если разработчик ценит свое время, то он очень быстро напишет свою обертку над стандартным функционалом и по сути придумает очередной велосипед. В итоге получится та же функция get_field плагина ACF.

mendel:
Ну да, если я правильно помню тут выйдет 10 строк а не 15.
Запрос комментария
получение ид поста
запрос поста
получение ид категории
запрос категории
получение ид оунера
получение оунера
получение
и
вывод аватарки.
Ну и плюс еще пару строк "главного цикла".
Но все зависит от того как вы сделаете вывод комментария отдельно. Тут или куча кода, или опять говнокодить на "записях".

Если стоит задача получить аватарку пользователя, который связан с текущим термином таксономии, то для этого достаточно просто добавить для него дополнительное поле для указания пользователя, а для самого пользователя поле для аватарки. Полный код будет выглядеть примерно так:


$queried_object = get_queried_object();
if (!empty($queried_object->term_id)) $user_id = get_field('user', 'vendor_' . $queried_object->term_id);
if (!empty($user_id)) $image = get_field('image', 'user_' . $user_id);

3 строки, включая проверки. Функцию get_field можно заменить на стандартную get_metadata c соответствующей правкой кода. Ваш способ реализации с получением ID записи, комментария к ней и с циклом - это есть самый что не есть говнокод.

mendel:
Это только половина кода, ведь $vendor_id еще получить надо.

$queried_object = get_queried_object();

В свойстве term_id находится ID текущего термина ($vendor_id). Да, в 15 строк у меня не получилось вложиться.

mendel:
И на выходе специфичный код зависимый от плагинчика и в принципе не поддерживаемый самим вордпрессом, т.е. пишем на ACF а не на вордпрессе.

Этот плагин хорошо поддерживается разработчиками, в число которых я вхожу. На данный момент разработкой ACF 5 PRO на GitHub занимается 32 человека, включая переводчиков и QA.

mendel:
Потому что например то, что вы не используете альтернативный синтаксис

PSR-1 позволяет использовать как полный, так и сокращенный синтаксис, стандарт оформления кода WordPress разрешает только полные PHP теги.

Оксиген:
С интересом прочитаю ваше мнение по данному вопросу, основанное на личном опыте.

Лично мне нравится MyBB 1.8. Форум достаточно хороший с кучей дополнений.

Еще один неплохой форум - Burning Board от WoltLab. Он, правда, платный.

mendel:
Ну вы код приведите)


<?php if ($field = get_field('image', 'vendor_' . $vendor_id)) { ?>
<img src="<?php echo $field['sizes']['product']; ?>" alt="<?php echo $field['alt']; ?>" />
<?php } ?>

В примере product - это зарегистрированный ранее размер картинки, который требуется выводить на сайте, vendor - таксономия с производителями. Если сменить тип поля с картинки на галерею и поместить вывод в цикл, то для производителя можно указывать сколько угодно изображений.

mendel:
Для ВП это почти непосильная задача.
Начиная с того что не совсем понятно как выводить отдельно один комментарий (сделаем тип записи комментарий, а пост таксономией? или будем насиловать штатный механизм комментариев? хотя может я что-то не помню). Ну да ладно, опустим.

Отдельно один комментарий можно вывести с помощью функции get_comment. Если дополнительное поле с аватаркой связать с пользователем, то оно будет выводиться абсолютно так же как показано выше с той лишь разницей, что вместо vendor будет user с соответствующим ID (свойство user_id возвращаемого объекта с комментарием).

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

Оптимизайка:
Ну и наоффтопили! Где обсуждения Capistrano, Chef, Puppet, Ansible, Vlad the Deployer, Rex, Rocketeer, Phing вот этого вот всего?

Странно, что о WP-CLI никто не вспомнил. Если учесть специфику работы автора, то этот инструмент был бы очень кстати.

mendel:
да и кстати как вы в шаблоне выведете логотип производителя товара?

Для термина таксономии "Производители" просто добавляется еще одно дополнительное поле с картинкой. В случае с ACF делается это через админку без правки конфигов. Само изображение можно вывести в шаблоне через функцию get_field в нужном размере и с нужными метаданными.

mendel:
ПС: кстати вот прямо сейчас сажусь гвонокодить в том стиле за который Вы тут ратуете) Буду использовать в последнем моем магазине на опенкарте модуль ХТМЛ-содержимого не по назначению)

В OpenCart можно относительно быстро написать свой модуль и не городить лишний раз костыли. Вам же потом это все поддерживать.

mendel:
Костыли над костылями.

А зачем вы костылями пользуетесь? По WordPress есть много отличной документации с best practices. Если во время разработки им следовать, то поддержка проекта кардинально упростится.

Да, действительно, изначально WordPress создавался как платформа для блогов, но в последние годы разработчики планомерно делают ее все более и более универсальной. Из самого последнего в данном направлении - это постепенное внедрение REST API на уровне ядра.

mendel:
Вы понимаете что VQMOD это бред, но не видите что использование сущности записи под всё это говнокод. Ну да это вопрос опыта. Когда есть с чем сравнивать, то понимаешь разницу. А когда опыта не хватает, то можно и не по делу использовать инструмент.

Вы сравниваете разные вещи. Основным недостатком VQMOD/OCMOD является то, что они правят исходный код системы, что создает огромные проблемы при поддержке. Грубо говоря, если Даниель опять захочет что-то поменять, вынести модули в папку extensions или перевести весь код на Twig (это не шутка), то вся совместимость ломается. Хуже всего, что она может сломаться по-тихому и потом очень сложно найти что именно поломалось. Именно это является основной проблемой.

Способ хранения записей у WordPress - это его архитектурная особенность. Разработчики когда-то решили хранить все типы записей в одной таблице в базе данных. Грубо говоря, если разработчик создаст тип "Продукт", то все записи с этим типом будут храниться в той же таблице, что и обычные записи, страницы, вложения, ревизии и пункты меню. Решение не самое красивое, я от него не в восторге, но оно стабильно работает уже много лет.

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

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

В Yii2, например, для создания новой сущности требуется сначала создать модель, контроллер и представление, прописать нужные правила для валидации значений, написать код для CRUD, каким-то образом организовать дополнительные поля с помощью отдельной сущности и протестировать это все счастье. Да, Gii этот процесс несколько упрощает, но все равно на это все придется потратить гораздо больше времени. Переносить этот код из проекта в проект также сложнее.

Да, мне очень нравится работать с фреймворком Yii (1 и 2 версии), для многих задач он действительно незаменим, но для большинства стандартных проектов я предпочитаю использовать WordPress. Причина до жути проста: эта система позволяет получить требуемый результат гораздо быстрее и при этом ее поддержка не требует большого количества моего времени.

mendel:
У меня есть нечто подобное)
Пока правда в конфигах нужно отражать вручную, но к осени запланирован релиз модуля админки для удобной правки конфига из админки.
Но пока движок сыроват, выкатывать на паблик рано, да и есть вещи которые важнее по функционалу а не по красоте...

Если функционалом неудобно пользоваться, то им пользоваться не будут. Вообще создание качественного продукта требует огромного количества времени и сил. На написание чего-то сравнимого с ACF может легко уйти полгода-год. Вот, например, команда из 8 человек уже два года пилит на Yii2 систему DotPlant2. В своем нынешнем виде она все еще сырая.

Sly32:
Но не все задачи ему под силу. Сегодня делал опять же форму обратного звонка на Джанге - земля и небо. Потратил в 3 раза меньше времени, при том что Питон знаю гораздо хуже чем пхп.

Неужели у вас нет собственных наработок по формам обратной связи? Если нет, то можно тот же Contact Form 7 развернуть. Многие заказчики знакомы с этим дополнением и им не приходится меня дергать, если вдруг что-то в форме нужно поменять.

mendel:
Сделайте функционал ОпенКарта (про него вы кстати не ответили) на вордпрессе, и у вас получится.... опенкарт)

В этом нет смысла. На WordPress есть чудесный плагин WooCommerce, который по многим аспектам реализован удачнее OpenCart. Около 39% всех магазинов в мире используют именно это дополнение.

mendel:
Простенький сайт с десятком разных сущностей на ВП или на нормальном движке делать примерно одинаково. На вп может даже проще потому что много готового под него есть.
Но уже на простеньком "портале" с полсотни сущностей (такосономий и записей по вашему), да с поддержкой этого всего годами - всё будет уже не очень весело.
Портянки копипасты, портянки костылей, лабиринты процедурной каши...

Вы, наверное, неправильно меня поняли. Таксономия и тип записей - это не записи и категории, это просто один из способов их разделения и классификации. Если вдруг возникает необходимость в нескольких десятках типов записей и таксономий, то скорее-всего вы что-то не так делаете. Помимо этого необходимость много раз копировать и вставлять один и тот же код должна посеять зерно сомнения и навеять мысли на счет правильности избранной архитектуры. Если грамотно подойти к разработке, использовать стабильное API, то получится достаточно простой и поддерживаемый код.

У меня

mendel:
Сделать можно много чего. Даже VQMOD придумать. Но вот зачем?

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

mendel:
На ногами, но ведь работает. Да дыряво, но неуловимый Джо.... То что я напишу с нуля за два часа - вы сделаете за 30 минут с помощью уже написанного кем-то плагина. Да, он писал его полгода. Но он то уже есть... и даже десятком задач которые я могу сделать а вы нет, я не могу аргументировать - в ВП уже готовых вещей больше.)

К сожалению, аналогов ACF PRO для других систем я пока не встречал. На данный момент его разработкой и тестированием занимается более 30 человек, включая меня. За качеством кода там действительно следят.

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

Из стоящих альтернатив для WP есть CMB2, но там нельзя настроить поля через админку, приходится лезть в документацию. Есть также и Pods, но там возможностей меньше.

mendel:
Баннерокрутилка.

Самое очевидное решение - это создать новый тип записи "Баннер" с поддержкой миниатюры и описания. Можно также с помощью ACF PRO создать страницу настроек и туда вынести настройки баннеров, включая загрузку картинок, сортировку и указание дополнительной информации. Создание доп. полей производится через админку и не требует копания в коде. Остается только организовать вывод баннеров в нужном месте темы оформления.

mendel:
Плагин автогенерации метаполей и наименований для перелинковки (прописываем у каждого товара несколько блоков "похожие", "рекомендуемые" и т.п., с РАЗНЫМИ названиями для улучшения внутреннего ссылочного, но писать эти разные тексты руками не хотим, а хотим чтобы если оно заполнено, то выводилось из базы, а если нет, то выводилось по алгоритму, а список алгоритмов настраивается).

Эту задачу также можно решить с помощью плагина ACF PRO. Для определенных записей создается доп. поле для выбора связанных страниц, записей или рубрик. В качестве бонуса появляется возможность сортировать и отфильтровать записи, ограничить их минимальное или максимальное количество, указать какого типа записи можно выбрать, из какой рубрики и т. д.. Также можно создать отдельный тип записей для самих текстов и выделить под них еще одно дополнительное поле. Для генерации метаполей навешивается соответствующий обработчик на сохранение записи, например.

mendel:
Биллинг - счета, оплаты. Да даже корзина.
Тикет-система.
Хранение писем из фидбека в базе а не только отправка на почту.
График занятий для учебной группы с календариком (дни, занятия, преподаватели, группы, номера "уроков" и время их начала).
Шаблоны для почтовых рассылок и т.п.

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

mendel:
Всё это делать записями? Под всё это городить права, фиктивные шаблоны чтобы они выдавали таки 404 там где не нужно или другие извращения? Оставлять лишние поля и т.п.?
Ну это так, по памяти. Уже год с ВП дела не имею и функционал забыл как страшный сон.

Если записи нового типа не должны выводиться на фронтенде, то это можно явно указать при регистрации типа. За это отвечает параметр public функции register_post_type. Указываете его равным false и все, не нужно городить костыли с фиктивными шаблонами, правами и прочей ересью.

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

mendel:
Вордпресс просто старый. И у него возрастные болезни, плюс нецелевое использование. Те кто называют его УГ - не совсем правы. Но Опенкарт.... это проклятие а не движок.

WordPress постоянно меняется и при этом умудряется не ломать совместимость. API там более чем стабильно. Это большой плюс.

С OpenCart ситуация обратная. Там код в 2.х версии крайне нестабилен, поддерживать его сложно. По этой причине я сейчас меньше работаю с этой системой.

mendel:
А при создании простой CRUD-админки для каких-то сущностей связанных с плагином в ВП - накосячить легко, ведь большая часть кода пишется вручную. Нет, там есть встроенная проверка на xsrf, но ее нужно вручную указывать как в форме так и в обработке. Нет, там есть рекомендации, но их нужно знать, да и если человек читал, то "и так работает" часто будет сильнее.

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

Зачем изобретать велосипед и писать вручную код для работы с какой-то очередной сущностью?

В WordPress ведь можно создать новый тип записи со своими таксономиями и дополнительными полями с использованием встроенного API WordPress. Для изменения поведения системы есть Plugin API. Это все позволяет решить большую часть стандартных задач без изобретения собственных велосипедов и решения всех связанных с этим проблем. Вообще очень многие плагины в той или иной степени используют возможности, которые им предоставляет WordPress.

WooCommerce, например, для продуктов создает отдельный тип записей, для рубрик и меток товаров - таксономию, а атрибуты хранит с использованием Metadata API и все тех же таксономий. Плагин ACF также создает свой тип записей для групп и для отдельных полей. Работа со значениями полей производится через все тот же Metadata API. Чтобы это все работало быстро, в плагине реализовано кеширование с использованием все того же API WordPress. Стандартные функции также используются для работы с изображениями, редактором, для загрузки файлов и многих других вещей. Yoast SEO, например, активно использует Metadata API для хранения метаданных.

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

Всего: 800