Чи існує спосіб встановити користувацькі поля за замовчуванням під час створення публікації?


11

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

Візуально замість:

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

Я хотів би мати щось на кшталт:

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

Я знаю, що для цього є плагіни (CPT, More поля тощо), але я хотів би простий спосіб зробити це з базовою функцією.

Я спробував щось подібне (я використовую спеціальний тип публікації "продукт"):

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). Чи є ?

А може вся ідея помилкова і є інший шлях?

Відповіді:


9

Гак дій save_postвикликається збереженням, але я не знаю, чи можна додати метадані в цей час. Але слід створити / оновити метадані після збереження публікації за допомогою гачка дій updated_post_meta.

EDIT

Щоб попередньо вибрати деякі метаполя (користувацькі поля) на екрані створення публікацій, потрібно спочатку додати ці метазначення із порожнім значенням.

Якщо ви подивитеся на 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()
}

Справа в тому, що я зараз не намагаюся нічого додати на збереження, я намагаюся показати деякі власні вхідні поля, які вже відкрилися, коли користувач мав архів на сторінці редагування (див. Оновлення зі скріншотами)
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 і ізолювати свою операцію, перевіривши тип публікації, оскільки це працює на всіх типах публікацій. Очевидно, є ще якась логіка, яку вам доведеться вбудувати в це, щоб він працював на вас. Ви, ймовірно, повинні встановити метаполе публікації, яке перевіряє, чи ви встановили типові параметри одного разу, щоб ваші користувачі не розчарувались, якщо вони захочуть залишити мета-поле порожнім.

Якщо ви хочете, щоб параметри за замовчуванням були нульовими (як це показано в прикладі вашого коду), тоді не створюйте функцію, оскільки це лише додає накладні та розміщені мета поля за замовчуванням.

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 .

кг - це мій простір імен, ви можете назвати функцію, яка вам подобається. Я досить новачок у гачках та налаштуваннях 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.
кайзер

@kaiser, що ти маєш на увазі зі стилем 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;

} Додати запуск ('wp_insert_post', 'awh_field_type');

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.