Чи є якийсь фільтр / гачок дій для перевірки користувацького поля перед публікацією публікації?


11

У мене є звичайна подана заявка xxxx_url. xxxx_urlповинні бути унікальними.

Отже, перш ніж публікувати публікацію, я хочу переконатися, що xxxx_urlце унікально чи ні? Якщо вона не є унікальною, публікацію публікації слід відхилити.

Я спробував publish_post. Але це не правильно, оскільки він спрацьовує, коли ми публікуємо публікацію. Я хочу запустити свій код безпосередньо перед публікацією.


1
Чому б не встановити поточний ідентифікатор публікації як унікальне значення. Як: 132_urlде 132поштовий ідентифікатор. Чим ви завжди маєте унікальну цінність. Окрім цього: Спеціальні поля слід зберігати в save_postдії. У цій дії ви можете перевірити спеціальне поле (якщо воно не порожнє і має унікальне значення, наприклад), і на основі цього update_post_metaчи ні. Я думаю , ви могли б також перевірити призначені для користувача поля , і якщо він не має унікального значення, встановити post-statusна draftабо що - то ще, щоб відключити публікацію. Інакше я думаю, що для цього вам потрібен jQuery.
LWS-пн

Відповіді:


5

На початку wp_insert_postфункції, яка зберігає / оновлює публікацію, є фільтр, який називається wp_insert_post_empty_content. За замовчуванням цей фільтр перевіряє, чи всі поля заголовка, редактора та уривку порожні, і в цьому випадку процес збереження буде зупинений.

Однак, оскільки всі поля, які потрібно зберегти, передаються до цього фільтра, ви можете розширити цей фільтр, щоб включити будь-який інший тест, щоб визначити, чи слід вважати публікацію порожньою. Це було б щось подібне:

add_filter ('wp_insert_post_empty_content','wpse312975_check_unique_url',10,2);
function wpse312975_check_unique_url ($maybe_empty, $postarr) {

  // extract custom field from $postarr, check uniqueness

  if ($unique) return false else return true;
  }

Примітка: функція повинна повернути "true", щоб зупинити процес збереження.

Якщо спеціальне поле не є унікальним, ви також можете повторити попередження.


2
Це, мабуть, спрацює, але виглядає трохи більше як хак, ніж рішення. Я також вважав це, але пізніше вирішив не публікувати повідомлення, як wp_insert_post_empty_contentце семантично призначено для порожнього вмісту . Сказавши це, я не знайшов жодного гачка, який би семантично підходив і для цього.
Скотт

Ну, якби це було лише для порожнього заголовка та вмісту, не було б фільтра для розробників.
cjbj

1
Якщо ви зосереджуєтесь менше на простому слові "порожній", я б сказав, що цей фільтр має на меті перевірити, чи відповідає посада мінімальним вимогам для збереження. ОП хоче розширити мінімальні вимоги. Можливо, фільтр повинен бути названий, wp_insert_post_valid_contentщоб висловити це, але для решти він знаходиться саме в потрібному місці.
cjbj

@cjbj Якщо у вас виникне таке питання, як ви знайдете правильний фільтр? Я маю на увазі, як ти знайшов wp_insert_post_empty_contentфільтр?
Я найдурніша людина

1
Отже, коли ви працюєте з WP деякий час, ви якось знаєте, яка частина коду генерує, які частини адміністратора. Отже, ви шукаєте файл і перевіряєте вихідний код на наявність фільтрів.
cjbj

1

Як щодо використання AJAX для перевірки унікальності перед тим, як навіть надсилати публікацію на публікацію?

$( '#post' ).on( 'submit', function( event ) {
  event.preventDefault(); // Prevent publishing

  //Now do some AJAX Checks
  $.post( ajaxurl, data, function(response) {
    if ( response === 'success' ) {
        $( this ).off( event ).submit();
    } else {
        alert( 'The custom field must be unique' );
    }
  });
});  

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


0

Я б зачепився у фільтр wp_insert_post_data і обробляв це якомога менш нав'язливо, оскільки, наскільки я розумію, ви не хочете блокувати вставку допису, ви просто хочете уникати публікації публікації з подвійними мета-значеннями.

Я не можу занадто багато шкодувати в цьому випадку, оскільки ви не поділилися жодним кодом, але ось якийсь псевдо-код фільтра, який би працював:

function wp8193131_check_if_meta_value_is_unique ( $data, $postarr ) {
    // setup an uniqueness flag.
    $meta_is_unique = true;

    // check if the meta is unique and modify the `$meta_is_unique` flag accordingly.
    // {...} <- your code

    // if the meta is NOT unique keep the post status in draft.
    if ( ! $meta_is_unique ) {
        // you can force the current post to be draft until the meta value will became unique.
        $data['post_status'] = 'draft';
        // maybe, update the meta value with a hint of the fact that it's not unique.
        // or display a dashboard notice about it.
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'wp8193131_check_if_meta_value_is_unique' );

Ще одна чудова річ у цьому фільтрі - це те, що він відокремлений від вкладення wp_insert_attachment_data.

Я сподіваюся, що це допомагає, і що б ви не робили, це звучить приголомшливо!


2
Це може бути не дуже хорошою ідеєю. Що робити , якщо $data['post_status']це publishі користувач оновлює його? Чи не буде зробити пост як draftстворити 404проблему для цієї посади?
Скотт

@Scott Іншими словами, якщо опублікований пост виявить, окрім того, що його мета-значення не є унікальним, публікацію публікації слід відхилити, а публікацію - скласти. Знову ж таки, я не знаю, наскільки важливим є мета-значення, але якщо це тип даних про сортування чи щось важливе, то статус публікації має бути чернетки (що не означає 404 проблему, це просто говорить, що повідомлення було звільнився з публічної точки зору)
Андрій

-1

Чек повинен перейти wp_insert_post. Цей гачок випускається кожного разу, коли публікація публікується чи редагується.

Там ви можете виконати спеціальний запит, щоб перевірити, чи є якась публікація вже такою ж xxxx_urlцінністю чи ні.

add_action('wp_insert_post', function($post_id) {
    $meta_key = 'xxxx_url';
    $meta_value = get_post_meta($post_id, $meta_key, true);
    $query = new WP_Query([
        'post_type' => get_post_type($post_id),     // This might be unnecessary, if you check `post` post type only. Or use `any`.
        'meta_query' => [
            [
                'meta_key' => $meta_key,
                'meta_value' => $meta_value,
            ]
        ]
    ]);
    if ($query->have_posts()) {
        // invalid key, post with the same value already exists
    } else {
        // valid, key was not found anywhere
    }
});

3
Як я знаю, все, що ви пишете всередині повідомлення if / else, буде опубліковане з моменту wp_insert_postзапуску дії, коли повідомлення збережено, він не може заблокувати публікацію чи вставлення публікації.
Я найдурніша людина

Отже, ви хочете заблокувати публікацію, якщо публікація не завершить перевірку? Ви не написали це у своєму запитанні.
Петро Цибулька

Я це чітко зазначив If it isn't unique it should reject publishing post.у своєму питанні.
Я
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.