Сохраняйте данные пользовательских метабоксов более организованным способом в Wordpress

Я добавил мета-окно на страницу new-post, которое позволяет пользователям добавлять фотографии и писать описание. См. прикрепленное изображение.

введите здесь описание изображения

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

$photo_meta_data = array(
             'photo1' => array('title'=>'aaa', 'url'=>'http://..', 'desc'=>'ffff'),
             'photo2' => array('title'=>'aaa', 'url'=>'http://..', 'desc'=>'ffff'),
             'photo3' => array('title'=>'aaa', 'url'=>'http://..', 'desc'=>'ffff'),

        )

Но как это сделать? Это код, который я застрял в своем метабоксе.

    if( isset( $_POST[ 'photo-title1' ] ) ) {
            update_post_meta( $post_id, 'photo-title1', sanitize_text_field( $_POST[ 'photo-title1' ] ) );
   }

Я просто сохраняю данные поля как одно значение.

И в настоящее время я храню значения в таблице wp_postmeta вот так...

PostId   MetaKey       Value
 175   photo-title1    .....
 175   photo-URL1      .....
 175   photo-desc1     ..... 

 175   photo-title2    .....
 175   photo-URL2      .....
 175   photo-desc2     ..... 

 176   photo-title1    .....
 176   photo-URL1      .....
 176   photo-desc1     ..... 

Итак, это много данных для таблицы wp_postmeta, не так ли?

Есть ли более организованный способ сделать это? Должен ли я использовать отдельную таблицу для этих пользовательских метаданных? Или просто сделать, как я сделал?

Спасибо!


person Tharindu Thisarasinghe    schedule 19.12.2015    source источник


Ответы (2)


Вы должны сохранить все метаданные в одном многомерном массиве следующим образом:

// Save the meta value as one multi dimensional array, like below
$photo_data = array(
   array(
       'title' => 'Name here',
       'url' => 'http://example.com',
       'description' => 'My description here...'
   ),
   array(
       'title' => 'New name here',
       'url' => 'http://example.com',
       'description' => 'New description here...'
   )
);

// Save it using either update_post_meta() or add_post_meta()
update_post_meta( $post_id, 'photo_data', $photo_data );

// Reference it or get it like below later on:
$photo_data = get_post_meta( $post_id, 'photo_data', true );

// Get the values like below...
echo $photo_data[0]['name'];
echo $photo_data[0]['url'];
echo $photo_data[0]['description'];

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

https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data

person MrZiggyStardust    schedule 20.12.2015
comment
Я сделал это.. Но это сохранило строку с именем Array в БД для ключа photo_data.. Это нормально? - person Tharindu Thisarasinghe; 20.12.2015
comment
Используете ли вы какую-то функцию очистки или фильтр для изменения мета-значения поста? Например: sanitize_text_field() при использовании: update_post_meta()? Он должен работать из коробки, чтобы сохранять мета-значения сообщений в виде массивов. - person MrZiggyStardust; 20.12.2015
comment
Вы не должны очищать весь массив, перебирать каждое значение и добавлять пользовательскую очистку для каждого значения. Попробуйте удалить функцию санитарии и посмотрите, правильно ли она сохранена. - person MrZiggyStardust; 20.12.2015
comment
Спасибо! Я сделаю :) В любом случае, прежде чем вы ответили, я просто использовал функцию php serilize(). Значит, все-таки сработало. - person Tharindu Thisarasinghe; 20.12.2015

Сохраните массив в 1 метаключе для поста следующим образом:

[
    "photo1" => [
        "title" => ...
        "URL" => ...
        "data" => ...
    ],
    "photo2" => [
        "title" => ...
        "URL" => ...
        "data" => ...
    ],
] 
person Tdelang    schedule 19.12.2015
comment
Извините, я действительно не понимаю, что вы предлагаете... Не могли бы вы быть немного яснее...? я тут немного новенькая.. - person Tharindu Thisarasinghe; 19.12.2015