Есть ли способ установить пользовательские поля по умолчанию при создании записи?

24 сент. 2011 г., 19:46:22
Просмотры: 18.6K
Голосов: 13

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

Визуально, вместо:

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

Я хотел бы видеть что-то вроде:

Редактор WordPress с пользовательскими полями по умолчанию

Я знаю, что для этого есть плагины (CPT, More fields и др.), но мне нужен простой способ сделать это с помощью базовой функции.

Я пробовал что-то вроде этого (я использую пользовательский тип записи 'product'):

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

Но это не работает. Я думаю, что проблема в хуке (потому что edit_post срабатывает после обновления), но я не вижу хука для "новая запись" (сразу после того как пользователь нажимает "новая запись" в админке). Есть ли такой?

Или, может быть, вся идея неверна и есть другой способ?

0
Все ответы на вопрос 5
2

Хук действия save_post вызывается при сохранении, но я не уверен, можно ли добавлять метаданные в этот момент. Однако должно быть возможно создать/обновить ваши метаданные после сохранения записи с помощью хука действия updated_post_meta.

РЕДАКТИРОВАНИЕ

Чтобы предварительно выбрать некоторые метаполя (произвольные поля) на экране создания записи, вам сначала нужно добавить эти метазначения с пустым значением.

Если посмотреть на функцию post_custom_meta_box() (которая является callback для используемого метабокса postcustom) в файле wp-admin/includes/meta-boxes.php, можно увидеть, что функция использует list_meta() для создания предварительно выбранных метаполей.

Теперь давайте рассмотрим последовательность выполнения программы до отображения этого метабокса (Мы ищем action/filter hook, который можно использовать здесь):

  1. WordPress загружает файл post-new.php
  2. Этот файл создает запись по умолчанию в базе данных на строке 39 с помощью функции get_default_post_to_edit(). Это хорошо. По сути, запись уже находится в базе данных как авто-черновик. К сожалению, в этот момент нет никакого хука для изменения этих данных или добавления чего-то нового.
  3. На следующем шаге включается файл edit-form-advaned.php. Этот файл генерирует всю страницу админки и включает все необходимые метабоксы на основе параметра supports типа записи.
  4. На строке 136 включается метабокс произвольных полей postcustom и вызывается вышеупомянутая функция. И снова, нет хука действия, который мы могли бы использовать.

Заключение

Думаю, единственный способ — использовать jQuery или переопределить метабокс postcustom и добавить метазначения перед запуском функции list_meta().

Например:

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // возможно add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Добавляем метаданные к записи с ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // и затем копируем и вставляем содержимое метабокса из функции post_custom_meta_box()
}
24 сент. 2011 г. 20:26:48
Комментарии

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

mike23 mike23
25 сент. 2011 г. 16:19:11

Ах. Теперь я понял вашу проблему. Я отредактировал свой ответ.

Roman Roman
25 сент. 2011 г. 19:41:02
0

Это правильный способ добавить поддержку пользовательских полей (чтобы при редактировании записей не появлялись пустые поля)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // значение по умолчанию
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');
13 февр. 2013 г. 02:34:21
4

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

Я знаю, что это довольно старая запись, но решил поделиться простым решением, которое нашел на mariokostelac.com.

kg — это мой неймспейс, вы можете назвать функцию как вам угодно. Я довольно новичок в хуках и кастомизации WordPress в целом, но считаю, что wp_insert_post — это именно тот хук, который вам нужен.

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}
13 сент. 2012 г. 15:01:41
Комментарии

К вашему сведению: есть функция get_post_type(). Также при нестрогом сравнении следует использовать синтаксис условий в стиле YODA.

kaiser kaiser
4 окт. 2012 г. 12:41:37

@kaiser что ты имеешь в виду под стилем YODA? И почему get_post_type($post_id) лучше, чем $_GET['post_type']?

Aziz Aziz
3 мая 2016 г. 19:47:03

Используйте значение перед сравнением: 'page' === $_GET['post_type']. Иначе, если вы забудете один =, вы можете оказаться в ситуации, когда вы присваиваете значение вместо сравнения двух значений. И это приведёт к мусору в вашей базе данных. Возможно, вам также стоит использовать типобезопасное сравнение === (является ли значение page? и является ли значение типа string?).

kaiser kaiser
3 мая 2016 г. 19:51:21

@kasier Понял - значит, итоговый код выглядит примерно так: 'page' === get_post_type($post_id) ?

Aziz Aziz
3 мая 2016 г. 19:52:18
0

Вам следует использовать действие save_post и изолировать свою операцию, проверяя тип записи, так как это действие выполняется для всех типов записей. Очевидно, вам придется добавить дополнительную логику, чтобы это работало так, как вам нужно. Возможно, стоит установить поле произвольных метаданных (post meta), которое будет проверять, были ли уже установлены значения по умолчанию, чтобы не разочаровывать пользователей, если они хотят оставить поле метаданных пустым.

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

function register_custom_fields( $post_ID ) {
    //Проверка nonce должна быть здесь
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');
25 сент. 2011 г. 07:42:46
0

Если кому-то нужно получить произвольное поле по типу записи, оставляю код ниже, как я это сделал и что отлично работает у меня :)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action('wp_insert_post','awh_field_type');

19 мая 2016 г. 21:27:35