Czy jest jakiś filtr akcji / hook do sprawdzania poprawności niestandardowego pola przed opublikowaniem posta?

11

Mam niestandardowe pole o nazwie xxxx_url. xxxx_urlpowinno być wyjątkowe.

Przed opublikowaniem postu chcę się upewnić, że xxxx_urljest on unikalny, czy nie? Jeśli nie jest unikalny, opublikowanie postu powinno zostać odrzucone.

Próbowałem publish_post. Ale to nie jest poprawne, ponieważ uruchamia się, gdy publikujemy post. Chcę uruchomić mój kod tuż przed publikacją.

Jestem najgłupszą osobą
źródło
1
Dlaczego nie ustawić bieżącego identyfikatora postu jako unikalnej wartości. Na przykład: 132_urlgdzie 132jest identyfikator posta. Niż zawsze masz tutaj wyjątkową wartość. Poza tym: pola niestandardowe powinny zostać zapisane w save_postakcji. W tej akcji możesz sprawdzić niestandardowe pole (jeśli nie jest puste i ma na przykład unikalną wartość) i na podstawie tego update_post_metalub nie. Chyba można także sprawdzić pole niestandardowe, a jeśli nie ma unikalną wartość, ustawić post-statusna draftlub coś innego, do publikowania wyłączyć. W przeciwnym razie myślę, że potrzebujesz jQuery, aby to zrobić.
LWS-Mo

Odpowiedzi:

5

Na początku wp_insert_postfunkcji zapisującej / aktualizującej wpis znajduje się filtr o nazwie wp_insert_post_empty_content. Domyślnie ten filtr sprawdza, czy wszystkie pola tytułu, edytora i fragmentu są puste, w takim przypadku proces zapisywania zostanie zatrzymany.

Ponieważ jednak wszystkie pola, które mają zostać zapisane, są przekazywane do tego filtra, możesz go rozwinąć, aby uwzględnić każdy inny test określający, czy post należy uznać za pusty. Byłoby to coś takiego:

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;
  }

Uwaga: funkcja musi zwrócić „prawda”, aby zatrzymać proces zapisywania.

Jeśli niestandardowe pole nie jest unikalne, możesz także chcieć wyświetlić ostrzeżenie.

cjbj
źródło
2
To prawdopodobnie zadziała, ale wygląda trochę bardziej na hack niż na rozwiązanie. Rozważyłem to również, ale później postanowiłem nie publikować, ponieważ wp_insert_post_empty_contentjest semantycznie przeznaczone do pustych treści . Powiedziawszy to, nie znalazłem też żadnego haczyka, który byłby semantycznie odpowiedni do tego.
Scott,
Cóż, gdyby był tylko pusty tytuł i treść, nie byłoby filtra dla programistów.
cjbj
1
Jeśli mniej skupiasz się na samym słowie „pusty”, powiedziałbym, że ten filtr ma na celu sprawdzenie, czy post spełnia minimalne wymagania dotyczące zapisywania. OP chce poszerzyć minimalne wymagania. Być może należy nazwać filtr, wp_insert_post_valid_contentaby to wyrazić, ale dla reszty jest on dokładnie we właściwym miejscu.
cjbj
@cjbj Kiedy masz takie pytanie, jak znaleźć odpowiedni filtr? To znaczy, jak znalazłeś wp_insert_post_empty_contentfiltr?
Jestem najbardziej głupią osobą,
1
Cóż, kiedy pracujesz z WP od jakiegoś czasu, wiesz, która część kodu generuje, które części administratora. Więc wyszukaj plik i sprawdź kod źródłowy pod kątem dostępnych filtrów.
cjbj
1

Co powiesz na użycie AJAX-a do sprawdzenia niepowtarzalności przed wysłaniem postu do publikacji?

$( '#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' );
    }
  });
});  

Chociaż kod nie jest testowany, ale powinien działać. Być może będziesz musiał z nim zagrać, aby uzyskać pożądany rezultat.

Abhik
źródło
0

Chciałbym podłączyć się do filtru wp_insert_post_data i zająć się tym w jak najmniej ingerujący sposób, ponieważ rozumiem, że nie chcesz blokować wstawiania postu, po prostu chcesz uniknąć publikowania postu ze zduplikowanymi meta wartościami.

W tym przypadku nie mogę oszczędzić zbyt wiele, ponieważ nie udostępniono żadnego kodu, ale oto pseudo-kod filtru, który działałby:

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

Kolejną wielką zaletą tego filtra jest to, że jest on oddzielony od jednego załącznika wp_insert_attachment_data.

Mam nadzieję, że to pomaga, a cokolwiek robisz, brzmi niesamowicie!

Andrei
źródło
2
To może nie być dobry pomysł. Co jeśli $data['post_status']jest publishi użytkownik go aktualizuje? Czy opublikowanie posta nie draftstanowiłoby 404problemu dla tego postu?
Scott,
@Scott Innymi słowy, jeśli opublikowany post wykryje przy zapisie, że jego meta wartość nie jest unikalna, publikacja postu powinna zostać odrzucona, a post powinien zostać sporządzony. Znowu nie wiem, jak ważna jest ta meta wartość, ale jeśli jest to typ danych sortowania lub coś istotnego, to status wpisu powinien być w wersji roboczej (co nie oznacza, że ​​problem 404, po prostu mówi, że post został wycofał się z publicznego widoku)
Andrei
-1

Czek powinien iść do wp_insert_post. Ten hak jest uruchamiany za każdym razem, gdy post jest publikowany lub edytowany.

Tam możesz wykonać niestandardowe zapytanie, aby sprawdzić, czy którykolwiek post ma już tę samą xxxx_urlwartość, czy nie.

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
    }
});
Petr Cibulka
źródło
3
Jak wiem, cokolwiek napiszesz w środku, jeśli post instrukcji / / zostanie opublikowany, ponieważ wp_insert_postakcja jest uruchamiana po zapisaniu postu, nie może zablokować publikowania lub wstawiania postu.
Jestem najgłupszą osobą
Chcesz zablokować publikowanie, jeśli post nie przejdzie weryfikacji? Nie napisałeś tego w swoim pytaniu.
Petr Cibulka
Wyraźnie wspomniałem o tym If it isn't unique it should reject publishing post.w moim pytaniu.
Jestem najbardziej głupią osobą,