Gibt es eine Möglichkeit, benutzerdefinierte Standardfelder beim Erstellen eines Beitrags festzulegen?


11

Wenn ich einen neuen Beitrag erstelle, nachdem der Beitragseditor direkt nach dem Klicken auf "Neu hinzufügen" angezeigt wird, anstatt das Dropdown-Menü zu verwenden und ein benutzerdefiniertes Feld auszuwählen, möchte ich bereits einige standardmäßige benutzerdefinierte Feldeingaben haben offenes Ende.

Optisch statt:

Geben Sie hier die Bildbeschreibung ein

Ich hätte gerne so etwas wie:

Geben Sie hier die Bildbeschreibung ein

Ich weiß, dass es dafür Plugins gibt (CPT, Weitere Felder usw.), aber ich möchte eine einfache Möglichkeit, dies mit einer Grundfunktion zu tun.

Ich habe so etwas versucht (ich verwende einen benutzerdefinierten Beitragstyp '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');

Aber das scheint nicht zu funktionieren. Ich denke, dass der Hook wahrscheinlich falsch ist (weil er edit_postnach einem Update kommt), aber ich sehe keinen Hook für "neuer Beitrag" (direkt nachdem der Benutzer in wp admin auf "neuer Beitrag" geklickt hat). Gibt es irgendwelche ?

Oder ist die ganze Idee falsch und es gibt einen anderen Weg?

Antworten:


9

Der Aktions-Hook save_postwird beim Speichern aufgerufen, aber ich weiß nicht, ob Sie zu diesem Zeitpunkt Metadaten hinzufügen können. Es sollte jedoch möglich sein, Ihre Metadaten zu erstellen / zu aktualisieren, nachdem der Beitrag mit dem Aktions-Hook gespeichert wurde updated_post_meta.

BEARBEITEN

Um einige Metafelder (benutzerdefinierte Felder) auf dem Bildschirm nach der Erstellung vorzuwählen, müssen Sie diese Metawerte zuerst mit einem leeren Wert hinzufügen.

Wenn Sie sich die post_custom_meta_box()Funktion (die den Rückruf für die verwendete Metabox darstellt postcustom) in der Datei wp-admin/includes/meta-boxes.phpansehen, können Sie sehen, dass die Funktion list_meta()zum Erstellen der vorgewählten Metafelder verwendet wird.

Schauen wir uns nun den Programmablauf an, bis diese Metabox angezeigt wird (Wir suchen nach einem Aktions- / Filter-Hook, den wir hier verwenden können):

  1. WordPress lädt die Datei post-new.php
  2. Diese Datei generiert einen Standardbeitrag in der Datenbank in Übereinstimmung 39mit der Funktion get_default_post_to_edit(). Das ist schön. Grundsätzlich befindet sich der Beitrag bereits als Auto-Draft in der Datenbank. Leider gibt es derzeit keinen Haken, um diese Daten zu ändern oder etwas Neues hinzuzufügen.
  3. Als nächster Schritt wird die Datei edit-form-advaned.phpenthalten ist. Diese Datei generiert die Hole-Admin-Seite und enthält alle erforderlichen Metaboxen basierend auf dem supportsParameter des Beitragstyps.
  4. On line 136die benutzerdefinierten Felder metabox postcustomist enthalten und die obige Funktion aufgerufen. Wieder kein Action-Hook, den wir benutzen könnten.

Fazit

Ich denke, die einzige Möglichkeit, die Sie tun können, besteht darin, jQuery zu verwenden oder die postcustomMetabox zu überladen und die Metawerte hinzuzufügen, bevor Sie die list_meta()Funktion ausführen .

Z.B

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()
}

Die Sache ist, dass ich vorerst nicht versuche, etwas zum Speichern hinzuzufügen. Ich versuche, einige benutzerdefinierte Feldeingaben anzuzeigen, die bereits geöffnet sind, wenn der Benutzer auf der Bearbeitungsseite ankommt (siehe Aktualisierungen mit Screenshots)
mike23

Ah. Jetzt verstehe ich dein Problem. Ich habe meine Antwort bearbeitet.
Rofflox

3

Dies ist die richtige Methode, um Unterstützung für benutzerdefinierte Felder hinzuzufügen (Sie erhalten keine leeren Felder, wenn Sie Beiträge bearbeiten).

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

Sie sollten die Aktion save_post verwenden und Ihre Operation isolieren, indem Sie den Beitragstyp überprüfen, da dieser für alle Beitragstypen ausgeführt wird. Es gibt offensichtlich etwas mehr Logik, die Sie einbauen müssen, damit es für Sie funktioniert. Sie sollten wahrscheinlich ein Post-Meta-Feld festlegen, das überprüft, ob Sie die Standardeinstellungen einmal festgelegt haben, damit Ihre Benutzer nicht frustriert sind, wenn sie ein Post-Meta-Feld leer lassen möchten.

Wenn Sie möchten, dass die Standardeinstellungen null sind (wie in Ihrem Codebeispiel gezeigt), erstellen Sie keine Funktion, da dies nur zusätzlichen Aufwand verursacht und Post-Meta-Felder standardmäßig nicht mit Werten gefüllt werden.

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

Ich möchte eine eindeutige Meta-Beschreibung für jeden benutzerdefinierten Beitrag auf einer WP-Site haben, die ich entwickle. Also suchte ich auch nach einem benutzerdefinierten Standardfeld und landete hier.

Ich weiß, dass dies ein ziemlich alter Beitrag ist, aber ich dachte, ich würde die einfache Antwort veröffentlichen, die ich bei mariokostelac.com gefunden habe .

kg ist mein Namespace, Sie können die Funktion nach Ihren Wünschen benennen. Ich bin ziemlich neu in Hooks und WP-Customizing im Allgemeinen, aber ich glaube, wp_insert_post ist der Hook, den Sie suchen.

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

Zu Ihrer Information: Es gibt get_post_type(). Wenn Sie einen losen Vergleich durchführen, sollten Sie auch die Bedingungssyntax im YODA-Stil verwenden.
Kaiser

@kaiser was meinst du mit YODA Stil? Auch warum ist get_post_type($post_id) besser als $_GET['post_type']?
Aziz

1
Verwenden Sie den Wert vor dem Vergleich : 'page' === $_GET['post_type']. Andernfalls =könnten Sie in einer Situation enden, in der Sie einen Wert zuweisen , anstatt zwei Werte zu vergleichen , wenn Sie einen einzelnen vergessen . Und das wird als Müll in Ihrer Datenbank enden. Vielleicht möchten Sie auch einen === typsicheren Vergleich verwenden (ist der Wert page? Und ist der Wert des Typs string?)
Kaiser

1
@kasier Ich verstehe - also ist der endgültige Code so etwas wie : 'page' === get_post_type($post_id) ?
Aziz

-1

Wenn jemand ein benutzerdefiniertes Feld nach Post-Typ verwenden muss, lasse ich den Code unten so wie ich es getan habe und arbeite gut für mich :)

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.