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


11

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

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

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

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

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

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

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

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приходит после обновления), но я не вижу хука для «нового сообщения» (сразу после того, как пользователь нажимает «новое сообщение» в wp admin). Есть ли ?

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

Ответы:


9

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

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

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

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

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

  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'); // maybe 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) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // and then copy&past the metabox content from the function post_custom_meta_box()
}

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

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

3

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

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    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');

1

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

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

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    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');

1

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

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

kg - это мое пространство имен, вы можете назвать функцию как хотите. Я довольно плохо знаком с хуками и настройкой WP в целом, но я считаю, что 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;
}

FYI: Там в get_post_type(). Кроме того, при проведении свободного сравнения следует использовать синтаксис условия стиля YODA.
Кайзер

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

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

1
@kasier я вижу - поэтому окончательный код что - то вроде: 'page' === get_post_type($post_id) ?
Азиз

-1

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

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');

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.