Пользовательский тип записи с полями ввода для разделения таблицы в базе данных.
На данный момент я использую пользовательский тип записи под названием "местоположения", я хотел бы иметь возможность добавлять поля ввода в пользовательский тип записи, в котором будет храниться такая информация, как (адрес, тип, номер телефона и т. Д.) В отдельной таблице, называемой "маркеры", Поэтому при создании новой записи она создаст новую запись в маркерах таблицы из следующих полей ввода / будет обновляться или удаляться при изменении или удалении записи.
Я не уверен, с чего начать чтобы связать их вместе для работы таким образом, я знаю, как сделать insert.php файл для добавления новых местоположений и создания базы данных, но не с wordpress таким образом. Приношу свои извинения, но я довольно новичок в SQL и PHP.
3 answers
Вам следует избегать создания большего количества таблиц. Просто сделай это, если у тебя действительно есть на то веская причина. Обратите внимание, что wp_postmeta
может хранить практически любые данные, и просто используя get_post_meta
функция может выполнять всю работу в большинстве случаев.
Но если вы должны использовать другую таблицу и принимать ее в целом, то вы ищете save_post
и delete_post
крючки.
Репликация пользовательских полей
Потому что вы упомянули пользовательские поля, если хотите чтобы скопировать информацию из wp_postmeta
в другую таблицу, вы должны сделать что-то вроде:
add_action('save_post', 'save_markers');
function save_markers($post_id) {
global $wpdb;
$marker = get_post_meta($post_id, 'marker_custom_field', true);
// go and put $marker on the markers table
$wpdb->query("INSERT INTO markers ...");
}
Вышесказанное относится также к крючку delete_post
.
Метабоксы
Но, если вы хотите хранить информацию непосредственно в другой таблице, возможно, метабоксы подходят вам лучше.
add_action( 'add_meta_boxes', 'marker_add_meta_box');
function marker_add_meta_box() {
add_meta_box(
'marker_metabox',
__('Marker Title', 'your-plugin-textdomain'),
'marker_metabox',
'post'
);
}
function marker_metabox ($post) {
wp_nonce_field(plugin_basename( __FILE__ ), 'your-plugin-texdomain');
$marker = get_marker_from_another_table();
?>
<label for="marker_field">
<?php _e('Marker field description', 'your-plugin-texdomain'); ?>
</label>
<input type="text" id="marker_field" name="marker_field" value="<?php echo $marker; ?>" size="25" />
<?php
}
А затем, для его сохранения:
add_action('save_post', 'save_markers');
function save_markers ($post_id) {
if (defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE)
return;
if ('locations' != $_POST['post_type'])
return;
if (!current_user_can( 'edit_post', $post_id ))
return;
/* Here you have $marker and $post_id, then you can just
do the reference in your markers table. */
global $wpdb;
$marker = $_POST['marker_field'];
$wpdb->query("INSERT INTO markers VALUES ...");
}
И, конечно, вы можете выполнить дополнительные проверки с помощью приведенного выше кода.
У вас есть 3 варианта.
-
Просто используйте собственные пользовательские поля в WordPress, если у вас нет веских причин этого не делать, они вам подойдут и отлично будут работать с пользовательскими типами записей.
-
Создайте свои собственные пользовательские поля и привяжите их к своему CPT с помощью wpdb. Вам нужна веская причина, чтобы сделать это вместо использования вариант 1.
Ознакомьтесь с фреймворком pods, это в основном CPT с большим контролем над БД.
INSERT INTO `wp_postmeta` (post_id, meta_key, meta_value) VALUES (*ID*, 'translation', *VALUE*;
Где ИДЕНТИФИКАТОР - идентификатор записи, для которой вы прикрепляете значение, а ЗНАЧЕНИЕ - это мета-значение поля "перевод".
Как я уже сказал, выполнимо... но вам понадобится отдельный запрос на вставку для каждого сообщения. Вы можете сбросить все это в один текстовый файл и запустить весь набор за один проход, если хотите, в противном случае может потребоваться столько же времени, сколько и для простого добавления ключа через пользовательский интерфейс WordPress.