Должен ли я использовать пользовательские типы записей или пользовательские таблицы базы данных для разработки плагинов?


Я довольно новичок в написании плагинов wordpress, но я уже глубоко продвинулся и хочу убедиться, что делаю это "правильно" в своем предстоящем большом проекте.

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

Я не пока я знаю все свои данные, но будет несколько таблиц (или cpt), связанных между собой. Из моих исследований я получаю "ощущение", что мне следует избегать пользовательских таблиц базы данных, но я не уверен, как определить наилучшее решение.

В частности, меня беспокоят три области:

  • количество метаполей сообщений, которые мне понадобятся для моих дополнительных полей на cpt, если я пойду по этому маршруту, и если это сделает вещи "сложными"
  • насколько хорошо я могу возвращать запросы, используя полусложные реляционные фильтры для отчетов
  • как лучше всего управлять отношениями, особенно если у меня много-много отношений

Существует ли "правильный" путь? Спасибо за ваш вклад.

Author: Jeff, 2012-04-03

1 answers

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

  • Вы получаете пользовательский интерфейс панели мониторинга бесплатно
  • Вы автоматически используете преимущества кэширования WP, включая любые плагины постоянного кэша, которые могут использоваться при установке
  • Вы автоматически получаете полезные вещи, такие как исправления после публикации
  • Вы получаете доступ к классу WP_Query, который означает, что теоретически вам не нужно писать какой-либо (или, по крайней мере, не так много) вероятный-глючный-и-уязвимый-и-неэффективный SQL
  • Если вы планируете распространять плагин или открывать его для разработки с открытым исходным кодом, вы можете обнаружить, что разработчикам удобнее использовать пользовательские типы сообщений и связанные с ними функции API, чем ваши собственные пользовательские материалы

Проблемы с API CPT в основном связаны с тем фактом, что он тесно связан с метафорой "сообщений", и все аспекты этого типа данных, которые сопровождают метафору. Из командной строки MySQL выполните команду DESCRIBE wp_posts. WP предполагает, что у вашего контента есть название, что у него есть (единственный) автор, что вам нужно только отслеживать дату создания и дату последнего редактирования, что вам понадобится место для неиндексированного post_content и т. Д. Это хорошо работает для некоторых видов контента, но не обязательно для других. Вы уже указали на некоторые потенциальные проблемы:

Количество сообщений метаполя, которые мне понадобятся для моих дополнительных полей на cpt, если я пойду по этому маршруту, и если это сделает вещи "сложными"

Существует два способа расширения схемы wp_posts с помощью API CPT: postmeta и таксономия. Postmeta - это неиндексированные пары ключ-значение, которые отлично подходят для хранения множества разных данных, но совсем не оптимизированы для выполнения сложных поисков. Таксономии в этом отношении несколько более гибкие, но вы все равно столкнетесь с множеством потенциально дорогостоящих подзапросов, если у вас очень сложные поиски. (Хотя аргументы meta_query и tax_query и их классы конструкторов запросов очень хороши и удобны.)

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

Как чтобы лучше управлять отношениями, особенно если у меня много-много отношений

Отношения "многие ко многим" являются давним камнем преткновения в сообществе разработчиков WP (см. https://core.trac.wordpress.org/ticket/14513 ). Вы можете подделать это без использования пользовательских таблиц, сопоставив элементы таксономии с post_ids (так, например, вы можете сказать, что "P3 имеет отношение Y к P5", сказав, что у P3 есть тег "Y-P3"), но это очень быстро запутывает (и неэффективно). Вы также можете подумайте о создании собственной таблицы взаимосвязей, которая связывает CPTS - вы все равно получите преимущества CPTS и создадите только одну таблицу БД. Для хорошо выполненной версии этого метода см. Плагин Posts 2 Posts: https://wordpress.org/extend/plugins/posts-to-posts/

Итак, в конце концов, вы должны принять решение, основываясь на:

  • Вид(ы) данных, которые вы будете хранить - как они "публикуются"
  • Какие типы запросов потребуются - насколько сложные будут ли они
  • Масштаб - насколько сложна ваша желаемая схема, сколько всего у вас будет объектов и сколько пользователей вы ожидаете

Если ответы таковы: Очень сложный, не слишком сложный, и не нужно масштабировать супер-огромные, используйте CPTS. В противном случае рассмотрите свои собственные таблицы.

 65
Author: Boone Gorges, 2012-04-04 14:23:56