Czy istnieje sposób ustawienia domyślnych niestandardowych pól podczas tworzenia postu?

11

Gdy tworzę nowy post, zaraz po kliknięciu „Dodaj nowy” , gdy edytor postów pokazuje, zamiast korzystać z menu rozwijanego i wybierać niestandardowe pole do użycia, chciałbym mieć pewne domyślne pola niestandardowe otwarty koniec.

Wizualnie zamiast:

wprowadź opis zdjęcia tutaj

Chciałbym mieć coś takiego:

wprowadź opis zdjęcia tutaj

Wiem, że istnieją do tego wtyczki (CPT, więcej pól itp.), Ale chciałbym w prosty sposób to zrobić za pomocą podstawowej funkcji.

Próbowałem czegoś takiego (używam niestandardowego typu postu „produkt”):

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

Ale to nie działa. Myślę, że haczyk jest prawdopodobnie nieprawidłowy (ponieważ edit_postpojawia się po aktualizacji), ale nie widzę żadnego haka dla „nowego postu” (zaraz po kliknięciu przez użytkownika „nowego postu” przez administratora wp). Czy jest jakiś ?

A może cały pomysł jest zły i istnieje inny sposób?

mike23
źródło

Odpowiedzi:

9

Hak akcji save_postjest wywoływany przy zapisie, ale nie wiem, czy możesz teraz dodać metadane. Ale powinno być możliwe tworzenie / aktualizowanie metadanych po zapisaniu posta za pomocą haka akcji updated_post_meta.

EDYTOWAĆ

Aby wstępnie wybrać niektóre pola meta (pola niestandardowe) na ekranie tworzenia postu, musisz najpierw dodać te meta wartości z pustą wartością.

Jeśli spojrzysz na post_custom_meta_box()funkcję (która jest wywołaniem zwrotnym używanego metaboksu postcustom) w pliku wp-admin/includes/meta-boxes.php, możesz zobaczyć, że funkcja używa list_meta()do utworzenia wstępnie wybranych pól meta.

Teraz spójrzmy na przebieg programu, aż wyświetli się ten metaboks (Szukamy haka akcji / filtra, którego moglibyśmy użyć tutaj):

  1. WordPress ładuje plik post-new.php
  2. Ten plik generuje domyślny post w bazie danych on-line 39z funkcją get_default_post_to_edit(). To miłe. Zasadniczo post znajduje się już w bazie danych jako automatyczna wersja robocza. Niestety w tej chwili nie ma żadnych haczyków, aby zmienić te dane lub dodać coś nowego.
  3. Kolejnym krokiem edit-form-advaned.phpjest dołączenie pliku . Ten plik wygeneruje stronę administratora dziury i zawiera wszystkie wymagane metaboksy na podstawie supportsparametru typu postu.
  4. On-line zawiera 136niestandardowy metaboks postcustomi wywoływana jest powyższa funkcja. Ponownie, nie ma żadnego haka akcji, którego moglibyśmy użyć.

Wniosek

Myślę, że jedynym sposobem na to jest użycie jQuery lub przeciążenie postcustommetaboxa i dodanie meta wartości przed uruchomieniem list_meta()funkcji.

Na przykład

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()
}
rofflox
źródło
Chodzi o to, że nie próbuję na razie niczego dodawać podczas zapisywania, próbuję pokazać niektóre niestandardowe dane wejściowe pola już otwarte, gdy użytkownik pojawia się na stronie edycji (zobacz aktualizacje ze zrzutami ekranu)
mike23
Ach Teraz rozumiem twój problem. Zredagowałem swoją odpowiedź.
rofflox
3

To jest właściwa metoda dodawania obsługi pól niestandardowych (nie otrzymujesz pustych pól podczas edycji postów)

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');
Jurij Korolow
źródło
1

Powinieneś użyć akcji save_post i odizolować swoją operację, sprawdzając typ postu, ponieważ działa on na wszystkich typach postów. Jest oczywiście pewna logika, którą trzeba będzie w to wbudować, aby działała dla ciebie. Prawdopodobnie powinieneś ustawić pole meta post, które sprawdza, czy ustawiłeś wartości domyślne jeden raz, aby użytkownicy nie byli sfrustrowani, jeśli chcieliby pozostawić pole meta post puste.

Jeśli chcesz, aby wartości domyślne były zerowe (jak widać w przykładzie kodu), nie twórz funkcji, ponieważ powoduje to jedynie dodanie narzutu i pola meta po nie są domyślnie zapełniane wartościami.

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');
Brian Fegter
źródło
1

Chcę mieć unikalny meta opis dla każdego niestandardowego postu w witrynie WP, którą opracowuję. Więc szukałem też domyślnego niestandardowego pola i wylądowałem tutaj.

Wiem, że to dość stary post, ale pomyślałem, że opublikuję prostą odpowiedź, którą znalazłem na stronie mariokostelac.com .

kg to moja przestrzeń nazw, możesz nazwać funkcję, co chcesz. Jestem całkiem nowy w hakach i dostosowywaniu WP w ogóle, ale wierzę, że wp_insert_post to hak, którego szukasz.

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;
}
kaplan
źródło
FYI: Jest get_post_type(). Ponadto, podczas luźnego porównywania, powinieneś użyć składni warunków w stylu YODA.
kaiser
@kaiser co masz na myśli ze stylem YODA? Także dlaczego jest get_post_type($post_id) lepszy niż $_GET['post_type']?
Aziz
1
Użyj wartości przed porównania: 'page' === $_GET['post_type']. W przeciwnym razie, gdy zapomnisz jednego, =możesz skończyć w sytuacji, w której przypisujesz wartość zamiast porównywać dwie wartości. I to skończy jako śmieci w bazie danych. Możesz także użyć === bezpiecznego porównywania typów (jest to wartość page? I jest to wartość typu string?)
Kaiser
1
@kasier widzę - tak ostateczny kod jest coś takiego: 'page' === get_post_type($post_id) ?
Aziz
-1

jeśli ktoś potrzebuje wziąć niestandardowe pole według typu postu, zostawiam kod poniżej tego, co zrobiłem i działa dobrze dla mnie :)

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

Edgardo Aleman
źródło