Wie kann man Arbeitsbereich / Adminbereich in einem benutzerdefinierten Post-Typ ohne Plugins anpassen?

Seltsamerweise finde ich nicht viele Quellen im Internet, die über meine Wünsche sprechen. Also ich hoffe, es ist eine triviale Sache, die ich stelle (obwohl ich fürchte, dass es nicht ist und WordPress ist nur ..).

Natürlich brauche ich benutzerdefinierte Felder in meinen benutzerdefinierten Beitragstypen.

WordPress ‘native Art der Bearbeitung von benutzerdefinierten Feldern ist sehr unpraktisch und ich kann nicht erwarten, dass meine Kunden mit diesen Dropdowns umgehen und Felder hinzufügen, wie sie es brauchen.

Bisher verwalte ich meine benutzerdefinierten Felder mit dem Plugin “Erweiterte benutzerdefinierte Felder”.

Ich möchte verstehen, wie ich das alleine machen kann und hoffe daher auf mehr Flexibilität bei der Anpassung des Arbeitsbereichs / Adminbereichs der Seiten “Neuer Beitrag” und “Beitrag bearbeiten”.

Es muss eine Möglichkeit geben, benutzerdefinierte Felder im Code festzulegen und zu beeinflussen, wie die Eingaben auf der Verwaltungsseite zugänglich sind.

Als einfaches Beispiel möchte ich eine Quicklink-function zu der Seite hinzufügen, wo der Administrator Beiträge hinzufügen kann, die nur einen Titel und eine URL enthalten (ich kenne den nativen “Links” -Bereich und vermeide absichtlich die Verwendung)

Bisher habe ich ein einfaches One-File-Plugin erstellt, das die Deklaration für den benutzerdefinierten Posttyp enthält:

 _x( 'Quicklinks', 'post type general name' ), 'singular_name' => _x( 'Quicklink', 'post type singular name' ), 'add_new' => _x( 'Hinzufügen', 'book' ), 'add_new_item' => __( 'Quicklink hinzufügen' ), 'edit_item' => __( 'Quicklink bearbeiten' ), 'new_item' => __( 'Neue Quicklink' ), 'all_items' => __( 'Alle Quicklinks' ), 'view_item' => __( 'Quicklink ansehen' ), 'search_items' => __( 'Quicklink durchsuchen' ), 'not_found' => __( 'Kein Quicklink gefunden' ), 'not_found_in_trash' => __( 'Keine Quicklinks im Papierkorb gefunden' ), 'parent_item_colon' => '', 'menu_name' => 'Quicklinks' ); $args = array( 'labels' => $labels, 'menu_icon' => 'dashicons-admin-links', 'description' => 'Quicklinks sind vor allem für Shortcuts zu bestimmten Podcast-positionen da', 'public' => true, 'menu_position' => 5, 'supports' => array('title'), 'has_archive' => false, ); register_post_type('quicklink', $args); } add_action( 'init', 'my_custom_post_quicklinks' ); ?> 

Nochmal: Ich möchte das alles selbst im Code implementieren, ohne ein Plugin zu benutzen.

Vielen Dank!

fertig mit erweiterten benutzerdefinierten Feldern

Solutions Collecting From Web of "Wie kann man Arbeitsbereich / Adminbereich in einem benutzerdefinierten Post-Typ ohne Plugins anpassen?"

Ich denke du suchst nach “Meta-Boxen”.

Sie arbeiten mit add_meta_box() , um ein oder mehrere neue add_meta_box() für Ihre Post-Typen zu erstellen . ( Codex )

Sie müssen eine Callback-function einrichten, die den HTML-Code der Felder enthält, die Sie anzeigen / anzeigen möchten.

Außerdem benötigen Sie eine function zum Speichern dieser Felder mit add_post_meta() und update_post_meta() . (Code zum Hinzufügen und Aktualisieren )

Wenn Sie einige vorhandene remove_meta_box() entfernen möchten, können Sie remove_meta_box() . ( Codex )


Ein paar Details:

Mit dem folgenden Code können Sie eine neue Meta-Box auf dem neuen / bearbeiten Bildschirm Ihres “Quicklinks” Post-Typ erstellen. (weil ich “quicklink” als Post-Typ eingegeben habe)

 function create_custom_metabox() { add_meta_box( 'my_meta', // HTML 'id' attribute of the metabox __( 'My Setting', 'textdomain' ), // Title of metabox 'my_fields_callback', // Function that prints out the HTML for metabox 'quicklink', // The post-type of writing screen on which to show the edit screen section (example 'post' or 'page') 'normal', // The part of the page where the metabox should be shown ('normal', 'advanced', or 'side') 'high' // The priority within the context where the boxes should show ('high', 'core', 'default' or 'low') ); } add_action( 'add_meta_boxes', 'create_custom_metabox' ); 

Nach diesem Code sehen Sie bereits eine neue Meta-Box, aber sie wird leer sein, noch sind keine Felder zu sehen.

Als nächstes erstellen wir eine neue Callback-function mit unseren neuen Feldern: (siehe functionsname und Callback-Argument in add_meta_box() oben)

 function my_fields_callback( $post ) { // creating a custom nonce wp_nonce_field( basename( __FILE__ ), 'my_custom_nonce' ); // see and get if some meta is already saved $stored_meta = get_post_meta( $post->ID ); ?>  

< ?php }

Nach diesem Code sehen Sie bereits ein neues Eingabefeld und eine Beschriftung. Aber wenn Sie etwas eingeben, wird es immer noch nicht gespeichert werden! Also müssen wir eine Speicherfunktion hinzufügen:

 function save_my_meta( $post_id ) { // Checks save status $is_autosave = wp_is_post_autosave( $post_id ); $is_revision = wp_is_post_revision( $post_id ); $is_valid_nonce = ( isset( $_POST[ 'my_custom_nonce' ] ) && wp_verify_nonce( $_POST[ 'my_custom_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false'; // Exits script depending on save status if ( $is_autosave || $is_revision || !$is_valid_nonce ) { return; } // save our new created field if( isset( $_POST[ 'meta-text' ] ) ) { // if there is some content in the field, we update it update_post_meta( $post_id, 'meta-text', sanitize_text_field( $_POST[ 'meta-text' ] ) ); } } add_action( 'save_post', 'save_my_meta' ); 

Danach können wir die Werte Ihres neuen Feldes speichern.

Wenn Sie diese Werte get_post_meta() möchten, können Sie die function get_post_meta() verwenden. ( Codex ) so:

 $my_meta_value = get_post_meta( get_the_ID(), 'meta-text', true ); if( !empty( $my_meta_value ) ) { echo $my_meta_value; } 

Sie sehen also, dass mehrere functionen benötigt werden. Es gibt viele Tutorials, hier ist eine alte, die immer noch funktioniert.

Ich konnte momentan keinen auf Deutsch finden, sorry.

Achten Sie auch darauf, die verschiedenen Werte der Felder beim Speichern und Abrufen zu bereinigen.

Ich hoffe das hilft!


Aktualisieren:

Wenn Sie eine add_meta_box() mit der function add_meta_box() erstellen, können Sie festlegen, wo die add_meta_box() mit dem add_meta_box() soll ...

 add_meta_box( 'my_meta', __( 'My Setting', 'textdomain' ), 'my_fields_callback', 'quicklink', 'normal', // The part of the page where the metabox should be shown ('normal', 'advanced', or 'side') 'high' ); 

Wenn Sie Seite auswählen, wird die Box in der rechten Seitenleiste erstellt.

In Bezug auf ACF und Felder ohne den Wrapper-Container:

Es scheint, wenn Sie ein Feld mit ACF ohne den Meta-Box-Wrapper / Container erstellen, werden einige Elemente nur versteckt, und einige zusätzliche Stile werden hinzugefügt, um den Container auszublenden!

Also ich denke, der beste Weg wäre, einige benutzerdefinierte CSS und vielleicht jQuery, nur auf der Bearbeiten / neue Seite des Post-Typ, der Ihre benutzerdefinierten Felder hat.

 function add_scripts_and_styles() { global $typenow; if( 'quicklink' != $typenow ) return; echo "   "; } add_action( 'admin_head-post-new.php', 'add_scripts_and_styles' ); add_action( 'admin_head-post.php', 'add_scripts_and_styles' ); 

Quelle: Diese Stackexchange-Antwort


Nonces: Ich versuche es zu erklären, aber vielleicht wird dir der Kodex klarer:

Ein Nonce in der WP-Ausgabe ist eine Sicherheitsfunktion. Es ist eine zufällige und einzigartige Kombination von Zahlen und Buchstaben, die nur für eine begrenzte Zeit und auch für jeden Benutzer gültig ist.

In diesem Fall verwenden wir das Formular, um zu überprüfen, ob die Eingabedaten vom echten Benutzer stammen. Das System prüft die Nonce beim Speichern, um zu sehen, dass niemand / etwas anderes versucht, die Daten zu speichern.

Oder wie der Codex es sagt:

Das Nonce-Feld wird verwendet, um zu überprüfen, ob der Inhalt der Formularanforderung von der aktuellen Site stammt und nicht von woanders.

Sie können hier und hier über Nonces lesen.

Was Sie suchen, ist eine benutzerdefinierte Meta-Box

Sie benötigen add_meta_box () , schauen Sie nach. Auch hier ist ein nettes Tutorial, das sich mit den Grundlagen beschäftigt: https://www.smashingmagazine.com/2011/10/create-custom-post-meta-boxes-wordpress/

Ich habe eine völlig anpassbare Lösung gefunden. Der von LWS-mo dargestellte allgemeine Ansatz bleibt gleich. Aber statt add_meta_box() ich add_post_meta()

add_meta_box() benötigt eine Callback-function, die den HTML- add_meta_box() . Mit add_post_meta() ein Callback manuell add_post_meta() werden.

Der Schlüsselaktionshaken ist hier edit_form_after_editor . (Eigentlich gibt es viele Haken für den Admin-Arbeitsbereich > WP Codex )


Eine weitere wichtige Erkenntnis, die ich hatte: Alle diese Änderungen gelten für jeden Post-Typ, es sei denn, Sie geben die functionen zurück, wenn der Post-Typ Ihren gewünschten unterscheidet. Deshalb habe ich eine Helfer-function erstellt, die als erstes in den Aktionshaken aufgerufen werden muss.

Außerdem habe ich in der function add_action functionsnamen add_action und anonyme functionen als Parameter verwendet. Ich finde diesen Weg bequemer; Bitte korrigieren Sie mich, wenn ich etwas größeres hier vermisse.

Hier ist der Code in Kurzversion:

 // helper function to prevent editing other post types than desired function is_my_posttype() { global $post; if ($post->post_type == "my_custom_posttype") return true; else return false; } // create custom post type add_action("init", function() { $labels = ... $args = ... register_post_type("my_custom_posttype", $args); }); // add custom fields add_action("add_meta_boxes", function() { if (!is_my_posttype()) return; add_post_meta($post->ID, "url", "", true); // true creates a unique custom field; no initial value needed add_post_meta(...) // create as many as you need }); // insert the html in both ADD and EDIT forms // $post parameter required add_action("edit_form_after_editor", function( $post ) { if (!is_my_posttype()) return; wp_nonce_field( basename( __FILE__ ), 'my_custom_nonce' ); // to check for later in save function $stored_meta = get_post_meta( $post->ID ); // now do whatever magic you want; // it gets inserted straight below the editor // without any wrapping html cage ?>  " /> Add even more < ?php }); // make the custom fields savable add_action("save_post", function( $post_id )) { if (!is_my_posttype()) return; // Checks save status $is_autosave = wp_is_post_autosave( $post_id ); $is_revision = wp_is_post_revision( $post_id ); $is_valid_nonce = ( isset( $_POST[ 'my_custom_nonce' ] ) && wp_verify_nonce( $_POST[ 'my_custom_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false'; // Exits script depending on save status if ( $is_autosave || $is_revision || !$is_valid_nonce ) { return; } update_post_meta($post_id, "url", $_POST["url"]); update_post_meta( ... ) // update all the other post metas });