Ключевые слова таблицы Wordpress - PullRequest
0 голосов
/ 05 октября 2018

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

Я понимаю, что для этого есть отдельная таблица wp_user_meta, но я бы предпочел использовать пользовательскую таблицу, так как япланируйте использовать Wordpress / Woocommerce в качестве начальной платформы, а затем, надеюсь, перейдите на другие.Данные также будут часто запрашиваться.

Для этой пользовательской таблицы требуется одна запись на пользователя, определяемая идентификатором в wp_user, поэтому, по сути, это отношение один к одному.Пример схемы для пользовательской таблицы:

CREATE TABLE {$wpdb->prefix}custom_table (
  custom_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  user_id BIGINT UNSIGNED NOT NULL,
  custom_data varchar(200) NULL,
  FOREIGN KEY (user_id) REFERENCES wp_users(ID),
  PRIMARY KEY (custom_id)
)

Мой вопрос об использовании Wordpress, как вы гарантируете, что отношение один к одному поддерживается?

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

Кроме этого, разрешено ли пользователям вообще менять свой идентификатор в жизненном цикле пользователя?Является ли это случаем использования хуков регистрации / удаления, чтобы обеспечить актуальность данных в пользовательской таблице?(Или удаление каскадно переходит к другим таблицам, когда это происходит в таблице wp_user)

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Для справки фрагмент кода - обратите внимание, что должны быть проверены проверки размера массива и т. Д., Но это заставляет меня двигаться в правильном направлении.Спасибо @ cabrarahector

require_once ABSPATH . 'wp-admin/includes/upgrade.php';
global $wpdb;

$query = "SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA='{$wpdb->dbname}' AND TABLE_NAME='{$wpdb->users}';";
$engine = $wpdb->get_results( $query )[0]->ENGINE;

$sql = "CREATE TABLE {$wpdb->prefix}custom_table (
    custom_id bigint unsigned NOT NULL AUTO_INCREMENT,
    user_id bigint(20) unsigned NOT NULL,
    custom_data varchar(200) NULL,
    FOREIGN KEY (user_id) REFERENCES wp_users(ID) ON DELETE CASCADE,
    PRIMARY KEY (custom_id),
    UNIQUE (user_id)
) ENGINE={$engine};";

dbDelta($sql);

это создает пользовательскую таблицу в базе данных

0 голосов
/ 05 октября 2018

AFAIK, пользователи не могут изменять свои идентификаторы или имена пользователей (потому что, ну, это приводит к большому количеству проблем), так что вы в этом хороши.

Кроме того, есть несколько«подводные камни!»Вам необходимо знать:

  1. Ваш запрос не будет выполнен, поскольку user_id не определяется точно так же, как столбец ID в wp_users.У вас есть: user_id BIGINT UNSIGNED NOT NULL.Это должно быть: user_id BIGINT(20) UNSIGNED NOT NULL.

  2. Чтобы сделать user_id уникальным - и поддерживать отношения один-к-одному - вам нужно добавить UNIQUE(user_id) к вашемуquery.

  3. Ваша таблица должна использовать точно такой же механизм хранения .В вашем запросе вы не определяете для него механизм хранения, поэтому MySQL будет использовать по умолчанию тот, который может быть, а может и не быть тем, который используется в таблице wp_users.Если это не тот же запрос, запрос -again- завершится неудачей, и ваша таблица не будет создана.

Вот пересмотренный запрос, предполагая, что wp_users использует механизм хранения MyISAM:

CREATE TABLE {$wpdb->prefix}custom_table (
  custom_id bigint unsigned NOT NULL AUTO_INCREMENT,
  user_id bigint(20) unsigned NOT NULL,
  custom_data varchar(200) NULL,
  FOREIGN KEY (user_id) REFERENCES wp_users(ID) ON DELETE CASCADE,
  PRIMARY KEY (custom_id)
  UNIQUE (user_id)
) ENGINE=MyISAM

Если вы хотите убедиться, что ваша таблица использует тот же механизм хранения, что и таблица wp_users, и вы выполняете этот запрос перед созданием таблицы, она скажет вам, какой вам нужен:

SELECT ENGINE 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA='{$wpdb->dbname}' AND TABLE_NAME='{$wpdb->users}';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...