Erstellung von einem dynamischen benutzerdefinierten Post-Type-Plugin
German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)
Oft müssen Sie eine Auswahl treffen und entscheiden, wie Sie eine bestimmte Funktionalität implementieren möchten. WordpPress hat einen ziemlich flexiblen Ansatz für fast jedes Problem. In diesem Tutorial werden wir uns ansehen, wie flexibel die API für benutzerdefinierte Post-Typen ist.
Es gibt viele Dinge, die Sie mit benutzerdefinierten Beitragstypen tun können, einschließlich des Generierens und Verwaltens bestimmter Beiträge auf einigen benutzerdefinierten Seiten, Diashows, Galerien und sogar Portfolioelementen. Einige Leute wissen noch nicht, dass sie existieren, andere verstehen ihre Optionen und ihre Verwendung nicht vollständig. In den folgenden Schritten werden wir versuchen, ein bestimmtes Plugin zu erstellen, das am besten benutzerdefinierte Beitragstypen verwendet. Um genauer zu sein, werden wir ein Plugin erstellen, das einen benutzerdefinierten Beitragstyp erstellt, der andere benutzerdefinierte Beitragstypen dynamisch erstellt und verwaltet (es ist wie Inception hier!).
Schritt 1 Der Plan
Bevor wir überhaupt anfangen, werden wir uns im Detail ansehen, was wir in diesem Tutorial bauen werden, wie und warum. Der Zweck dieses Tutorials ist es, sich mit benutzerdefinierten Beitragstypen in WordPress vertraut zu machen.
Zu diesem Zweck erstellen wir ein Plugin, das einen benutzerdefinierten Hauptposttyp erstellt, und verwenden dann die Posts in diesem benutzerdefinierten Posttyp mit einem Einstellungs-Meta-Feld, um zusätzliche, dynamische benutzerdefinierte Post-Typen basierend auf den Meta-Box-Schnittstellenoptionen zu erstellen. Dies wird Ihnen helfen, alle benutzerdefinierten Post-Optionen und einige der Möglichkeiten, die sie bieten können, im Detail zu verstehen. Für die Zwecke dieses Tutorials wird vorausgesetzt, dass Sie einen funktionierenden Apache-Server mit PHP und MySQL haben und WordPress installiert ist, damit Sie den Plugin-Code auf einer Version 3.0+ von WordPress testen können.
Jeder Beitrag wird als neuer benutzerdefinierter Beitragstyp interpretiert, und wir werden die Konfigurationsoptionen jedes Beitrags in benutzerdefinierten Feldern mithilfe eines Meta-Felds mit vielen Formularen, Kontrollkästchen, Dropdown-Feldern und Textfeldern speichern, in denen das gespeichert und angezeigt wird Daten, die es dem Benutzer leicht machen, irgendetwas zu ändern.
Da das Plugin 450 Codezeilen enthält, ist nicht jede Codezeile im Lernprogramm vorhanden, da der meiste Code wiederholt wird und nur die Variablen unterschiedlich sind. Es werden jedoch alle Funktionen des Plugins erläutert und der Quellcode als Beispiel angegeben.
Schritt 2 Erstellen und Verstehen der Hooks
Wenn wir zur benutzerdefinierten Post-Type-Funktionalität, zur Metabox-Funktionalität und zum Speichern von Daten bei Aktualisierungs- oder Veröffentlichungsaktionen gelangen möchten, benötigen wir Hooks und müssen diese speziell implementieren, um den gewünschten Effekt zu erzielen.
1 |
add_action('save_post', 'cpt_save_postdata'); |
2 |
add_action('add_meta_boxes', 'cpt_add_meta_boxes'); |
3 |
add_action('init', 'init_custom_post_types'); |
In diesem Tutorial werden nur drei Hooks benötigt, keine Filter, sonst nichts in der Kernfunktionalität. Zuerst benötigen wir einen Hook, um den benutzerdefinierten Beitragstyp in seiner Rückruffunktion zu generieren. Dafür verwenden wir den init-Tag-Hook und die Rückruffunktion mit dem Namen 'init_custom_post_types'. Hier geschieht die ganze Magie, nämlich hier deklarieren wir unsere benutzerdefinierten Beitragstypen und machen sie dynamisch, indem wir die Werte aus der Datenbank extrahieren und dynamische benutzerdefinierte Beitragstypen in einer Schleife generieren. Dieser Teil des Codes wird später erläutert.
Ein weiterer Hook, den wir benötigen, ist der Tag-Hook 'add_meta_boxes', der auf die Rückruffunktion 'cpt_add_meta_boxes' verweist und zum Generieren der Meta-Boxen innerhalb des benutzerdefinierten Hauptposttyps verwendet wird, der alle anderen benutzerdefinierten Posttypen generiert. Hier erstellen wir die Formulare, in denen die Daten gespeichert und aktualisiert werden, die wir zum Erstellen unserer Funktionen bearbeiten müssen.
Der letzte Hook, den wir verwenden, ist 'save_post' mit der Rückruffunktion von 'cpt_save_postdata' und dem Zweck, die in der Meta-Box veröffentlichten Daten zu speichern. Wenn der Benutzer die Seite des wichtigsten benutzerdefinierten Beitragstyps im Admin-Bereich übermittelt, werden alle Formularfelder übermittelt. Dies ist der Hook, mit dem wir diesen Inhalt abrufen und zur späteren Verwendung in der Datenbank speichern / aktualisieren.
Schritt 3 Erstellung von dem benutzerdefinierten Hauptposttyp
Zunächst müssen wir einen allgemeinen benutzerdefinierten Beitragstyp erstellen, der den gesamten dynamischen Inhalt verarbeitet. Dazu erstellen wir zunächst einen generischen benutzerdefinierten Beitragstyp mit fest codierten Daten wie im nächsten Beispiel. Zuerst erstellen wir die Etiketten. Der Label-Parameter ist einer der Hauptargumentwerte, der als Array interpretiert wird. Die Array-Werte werden durch ihre Bezeichner angegeben, insbesondere name für den allgemeinen Hauptnamen des benutzerdefinierten Beitragstyps, der normalerweise eine Pluralzeichenfolge des benutzerdefinierten Beitragstypnamens ist, singularname für den Objektnamen des benutzerdefinierten Beitragstyps im Singular, add_new Zeichenfolgentext, add_new_item, das der Standard ist, fügen Sie neuen Beitrags- / Seitentext hinzu, edit_item als Standardtext für das Bearbeiten von Beiträgen oder Seiten. all_items wird verwendet, um den gesamten benutzerdefinierten Beitragstypnamen anzuzeigen, wenn dies angefordert wird (Beispiel: alle Autos), view_items und search_items werden wie im vorherigen Beispiel nur für die offensichtlich unterschiedlichen Zwecke verwendet. not_found, not_fount_in_trash, parent_item_colon sind auch Ersatztexte, die für bestimmte Seiten der Funktionen für Posts (benutzerdefinierte Post-Typen) verwendet werden, die Sie möglicherweise für jeden von Ihnen erstellten benutzerdefinierten Post-Typ ändern möchten.
Im nächsten Beispiel verwendet das Array $label CPT, um den Standardtext für post/posts/page/pages zu ersetzen. Ich denke, es ist für einige Leser nicht notwendig, aber nur um sicherzugehen, dass ich die Idee nicht verpasse, steht CPT für Custom Post Type und wird und wird während des Tutorials auf verschiedene Arten verwendet.
Ein wichtiger Hinweis: Dieser Code wird in die Rückruffunktion init_custom_post_types eingefügt, damit er ordnungsgemäß funktioniert.
1 |
$labels = array( |
2 |
'name' => _x('CPT', 'post type general name'), |
3 |
'singular_name' => _x('CPT', 'post type singular name'), |
4 |
'add_new' => _x('Add New CPT', 'CPT'), |
5 |
'add_new_item' => __('Add New Post type'), |
6 |
'edit_item' => __('Edit CPT'), |
7 |
'new_item' => __('New CPT'), |
8 |
'all_items' => __('All CPT'), |
9 |
'view_item' => __('View CPT'), |
10 |
'search_items' => __('Search CPT'), |
11 |
'not_found' => __('No CPT found'), |
12 |
'not_found_in_trash' => __('No CPT found in Trash'), |
13 |
'parent_item_colon' => '', |
14 |
'menu_name' => __('CPT') |
15 |
);
|
16 |
|
17 |
$args = array( |
18 |
'labels' => $labels, |
19 |
'public' => true, |
20 |
'publicly_queryable' => true, |
21 |
'show_ui' => true, |
22 |
'show_in_menu' => true, |
23 |
'query_var' => true, |
24 |
'rewrite' => true, |
25 |
'capability_type' => 'post', |
26 |
'has_archive' => true, |
27 |
'hierarchical' => false, |
28 |
'menu_position' => null, |
29 |
'supports' => array('title') |
30 |
);
|
31 |
register_post_type('CPT', $args); |
Das Hauptarray, das zum Generieren des benutzerdefinierten Beitragstyps benötigt wird, ist das Array $args, das ausschließlich zum Festlegen der Hauptoptionen des benutzerdefinierten Beitragstyps und zum Verwalten seiner Funktionalität verwendet wird.
- Die erste Array-Variable heißt label und wir haben uns zuvor um die Struktur dieses Werts gekümmert.
-
public- Eine boolesche Variable, true oder false, die die Verfügbarkeit des benutzerdefinierten Beitragstyps darstellt, wenn sie für die Administrationsoberfläche oder für Front-End-Benutzer im Design öffentlich ist. -
public_queryable- wieder ein boolescher Wert, der festgelegt wird, ob das Front-End die Ergebnisse des benutzerdefinierten Beitragstyps abfragen kann. -
show_ui- Ein boolescher Wert, der angibt, ob Standard-Administratorinhalte für den benutzerdefinierten Beitragstyp generiert werden oder nicht. -
show_in_menu- eine weitere boolesche Variable, für deren Funktionshow_uiwahr sein muss, da der Beitragstyp im Menü des WordPress-Administrationsbereichs angezeigt oder nicht angezeigt werden soll. -
query_var- Erstellt einen Abfrage-Var-Schlüssel für diesen benutzerdefinierten Beitragstyp. Sie können es als Booleschen Wert oder als Zeichenfolge verwenden. Wenn dies der Fall ist, deaktiviert false die Verwendung des Abfragevariablenschlüssels und die Zeichenfolge legt einen benutzerdefinierten Schlüssel fest. In unserem Beispiel verwenden wir den Standardwert und setzen ihn auf true. -
rewrite- Dies verhindert das Umschreiben für diesen Beitragstyp. -
capability_type- Endlich eine Zeichenfolge, die festlegt, ob der benutzerdefinierte Beitragstyp ein Beitrag oder eine Seite ist, in einer einfachen Textzeichenfolge. Wir benutzen Post. -
has_archive- Dieser Parameter aktiviert Post-Archive und verwendet standardmäßigpost_typeals Archiv-Slug. -
hierarchical- ein Boolescher Wert, der festlegt, ob der Beitragstyp hierarchisch ist oder nicht, d. h. ob Eltern angegeben werden können oder nicht. -
menu_position- Eine Zeichenfolge, die die Position darstellt, die der Beitragstyp im Menü anzeigen soll. Die Werte reichen ungefähr von 5 bis 100. -
supports- dieser Wert hat wieder einen Array-Wert, diesmal mit Werten wie Titel, Editor, Miniaturansicht, benutzerdefinierten Feldern, Trackbacks, Revisionen, Seitenattributen und Postformaten.
Das Hauptargument args wird in der nächsten Funktion register_post_type verwendet, die den ersten Parameter, den Namen des benutzerdefinierten Posttyps (in unserem Fall CPT) und den zweiten Parameter, die Variable $args, enthält.
Dies umfasst im Wesentlichen das Erstellen unseres benutzerdefinierten Hauptposttyps anhand des oben angegebenen und erläuterten Beispiels.
Schritt 4 Codierung von der Meta Box
Zuerst haben wir Hooks behandelt. Einer der Hooks hat ein Tag implementiert, dessen Rückruffunktion speziell für die Implementierung von Meta-Boxen entwickelt wurde. Diese Funktion sieht folgendermaßen aus:
1 |
function cpt_add_meta_boxes() { |
2 |
add_meta_box('cpt_meta_id', 'Custom Post Type Settings', 'cpt_inner_custom_box', 'CPT', 'normal'); |
3 |
}
|
Innerhalb der Funktion haben wir die Funktion add_meta_box, die die Standardparameter für die Implementierung einer Meta-Box enthält, nämlich die eindeutige Meta-Box-ID, deren Titel, die Rückruffunktion und den benutzerdefinierten Beitragstyp, auf den sie angewendet werden soll Zumindest die Position (wir werden sie auf normal setzen, wie wir es wollen, direkt unter dem Editor).
Das ist es für das Generieren mit der API, aber womit füllen wir es? Nun, wir müssen es mit allen zuvor diskutierten Optionen aus Schritt 3 füllen und dazu werden wir Formularfelder erstellen und sie je nach Typ mit Daten füllen.
Einige werden Kontrollkästchen sein
Wir verwenden Kontrollkästchen für die Array-Argumente, die boolesche Werte benötigen. Aktiviert ist wahr und deaktiviert ist falsch.
1 |
<td><input type="checkbox" <?php |
2 |
if ($cp_publicly_queryable == "on") { |
3 |
echo "checked"; |
4 |
}
|
5 |
?> name="cp_publicly_queryable" /> Publicly Queryable </td> |
Andere werden Dropdown-Boxen sein
Einige Array-Argumente erfordern die Auswahl mehrerer Elemente. Dafür verwenden wir Dropdown-Felder mit fest codierten Werten, die unseren Anforderungen entsprechen.
1 |
<td>Menu Position:<br/> |
2 |
<select name="cp_menu_position"> |
3 |
<option value="post" <?php |
4 |
if ($cp_menu_position == "post") { |
5 |
echo "selected"; |
6 |
}
|
7 |
?>>Post</option> |
8 |
<option value="page" <?php |
9 |
if ($cp_menu_position == "page") { |
10 |
echo "selected"; |
11 |
}
|
12 |
?>>Page</option> |
13 |
</select>
|
14 |
</td>
|
Und andere Textfelder
In diesen Formularfeldern werden Zeichenfolgenwerte gespeichert.
1 |
<td>General name:<br/> <input type="text" name="cp_general_name" value="<?php echo $cp_general_name; ?>"/></td> |
Vielleicht haben Sie bemerkt, dass sie mit PHP-Variablen gefüllt sind und mit Daten funktionieren. Aber woher kommen diese Variablen, fragen Sie sich vielleicht, und was ist mit den Daten? Um diese Frage zu beantworten, müssen wir mit dem nächsten Schritt fortfahren und die gerade erstellten Formularfelder speichern. Aber weil ich Sie nicht dazu bringen möchte, die Schritte vor und zurück zu gehen, werde ich Sie bitten anzunehmen, dass alle Daten irgendwie in der Datenbank gespeichert sind. Ich werde Ihnen zeigen, wie und alles, was wir tun müssen, ist sie zu extrahieren in Variablen wie im folgenden Beispiel:
1 |
global $post; |
2 |
|
3 |
$cp_public = get_post_meta($post->ID, 'cp_public', true); |
In unserer Meta-Box-Rückruffunktion deklarieren wir die globale Variable $post, um die aktuelle Post-ID später abzurufen. Da die Daten als benutzerdefinierter Post gespeichert werden, verwenden wir die Funktion get_post_meta, um den Meta-Schlüsselwert für jede Variable wie zu erhalten Im obigen Beispiel ist der erste Parameter die Post-ID, der zweite der Metaschlüssel und der dritte ein Boolescher Wert, der die Funktion auffordert, einen String und kein Array zurückzugeben.
In diesem Lernprogramm werden 27 Variablen verwendet, die als benutzerdefinierte Beiträge gespeichert sind. Sie sehen folgendermaßen aus:
1 |
$cp_public = get_post_meta($post->ID, 'cp_public', true); |
2 |
$cp_publicly_queryable = get_post_meta($post->ID, 'cp_publicly_queryable', true); |
3 |
$cp_show_ui = get_post_meta($post->ID, 'cp_show_ui', true); |
4 |
$cp_show_in_menu = get_post_meta($post->ID, 'cp_show_in_menu', true); |
5 |
$cp_query_var = get_post_meta($post->ID, 'cp_query_var', true); |
6 |
$cp_rewrite = get_post_meta($post->ID, 'cp_rewrite', true); |
7 |
$cp_has_archive = get_post_meta($post->ID, 'cp_has_archive', true); |
8 |
$cp_hierarchical = get_post_meta($post->ID, 'cp_hierarchical', true); |
9 |
$cp_capability_type = get_post_meta($post->ID, 'cp_capability_type', true); |
10 |
$cp_menu_position = get_post_meta($post->ID, 'cp_menu_position', true); |
11 |
$cp_s_title = get_post_meta($post->ID, 'cp_s_title', true); |
12 |
$cp_s_editor = get_post_meta($post->ID, 'cp_s_editor', true); |
13 |
$cp_s_author = get_post_meta($post->ID, 'cp_s_author', true); |
14 |
$cp_s_thumbnail = get_post_meta($post->ID, 'cp_s_thumbnail', true); |
15 |
$cp_s_excerpt = get_post_meta($post->ID, 'cp_s_excerpt', true); |
16 |
$cp_s_comments = get_post_meta($post->ID, 'cp_s_comments', true); |
17 |
$cp_general_name = get_post_meta($post->ID, 'cp_general_name', true); |
18 |
$cp_singular_name = get_post_meta($post->ID, 'cp_singular_name', true); |
19 |
$cp_add_new = get_post_meta($post->ID, 'cp_add_new', true); |
20 |
$cp_add_new_item = get_post_meta($post->ID, 'cp_add_new_item', true); |
21 |
$cp_edit_item = get_post_meta($post->ID, 'cp_edit_item', true); |
22 |
$cp_new_item = get_post_meta($post->ID, 'cp_new_item', true); |
23 |
$cp_all_items = get_post_meta($post->ID, 'cp_all_items', true); |
24 |
$cp_view_item = get_post_meta($post->ID, 'cp_view_item', true); |
25 |
$cp_search_items = get_post_meta($post->ID, 'cp_search_items', true); |
26 |
$cp_not_found = get_post_meta($post->ID, 'cp_not_found', true); |
27 |
$cp_not_found_in_trash = get_post_meta($post->ID, 'cp_not_found_in_trash', true); |
28 |
$cp_parent_item_colon = get_post_meta($post->ID, 'cp_parent_item_colon', true); |
Was Sie verstehen müssen, ist, dass sie alle auf die gleiche Weise extrahiert werden. Diese lange Liste von Variablen enthält nichts Besonderes oder Unterschiedliches außer ihren Werten. Die Idee ist natürlich, dass dieser Code die Daten aus der Datenbank abruft und später in jedem Formularfeld verwendet wird, um diese Daten im Meta-Feld des Admin-Panels als ausgewählten Wert, als Zeichenfolge oder als aktiviertes Kontrollkästchen für Boolesche Werte anzuzeigen Werte. Alle Funktionen sind in den angehängten herunterladbaren Dateien besser zu sehen.
Bisher sieht ein benutzerdefinierter Beitrag des Meta-Box-Inhalts des benutzerdefinierten Beitragstyps auf der Grundlage unserer Implementierung so aus.


Schritt 5 Speichern der Daten
Alle aus der Meta-Box übermittelten Formulardaten müssen in der Datenbank gespeichert werden, damit sie später verwendet werden können, um den benutzerdefinierten Beitragstyp dynamisch und auch in der Funktionalität der Meta-Box dynamisch zu gestalten. Um die Daten zu speichern, haben wir die Funktion cpt_save_postdata als Rückruffunktion, die wir dafür erstellt haben. Diese Funktion muss jedoch mit Funktionen gefüllt sein, mit denen die Daten tatsächlich gespeichert werden. Wie speichern wir die Daten für all diese Elemente? Die einfachste und naheliegendste Antwort sind benutzerdefinierte Felder. Wir werden alle diese Werte in benutzerdefinierten Feldern des einzelnen benutzerdefinierten Hauptposttyps speichern, da es viel einfacher ist, sie später zu verwalten, wenn wir sie basierend auf einem bestimmten abgefragten Post extrahieren.
Hier finden Sie den gesamten Code, der zum Ausführen der zuvor angegebenen Funktion erforderlich ist, um alle benötigten Daten zu speichern.
1 |
global $post; |
2 |
if ($_POST['cpt-hidd'] == 'true') { |
3 |
$cp_public = get_post_meta($post->ID, 'cp_public', true); |
4 |
$cp_publicly_queryable = get_post_meta($post->ID, 'cp_publicly_queryable', true); |
5 |
$cp_show_ui = get_post_meta($post->ID, 'cp_show_ui', true); |
6 |
$cp_show_in_menu = get_post_meta($post->ID, 'cp_show_in_menu', true); |
7 |
$cp_query_var = get_post_meta($post->ID, 'cp_query_var', true); |
8 |
$cp_rewrite = get_post_meta($post->ID, 'cp_rewrite', true); |
9 |
$cp_has_archive = get_post_meta($post->ID, 'cp_has_archive', true); |
10 |
$cp_hierarchical = get_post_meta($post->ID, 'cp_hierarchical', true); |
11 |
$cp_capability_type = get_post_meta($post->ID, 'cp_capability_type', true); |
12 |
$cp_menu_position = get_post_meta($post->ID, 'cp_menu_position', true); |
13 |
$cp_s_title = get_post_meta($post->ID, 'cp_s_title', true); |
14 |
$cp_s_editor = get_post_meta($post->ID, 'cp_s_editor', true); |
15 |
$cp_s_author = get_post_meta($post->ID, 'cp_s_author', true); |
16 |
$cp_s_thumbnail = get_post_meta($post->ID, 'cp_s_thumbnail', true); |
17 |
$cp_s_excerpt = get_post_meta($post->ID, 'cp_s_excerpt', true); |
18 |
$cp_s_comments = get_post_meta($post->ID, 'cp_s_comments', true); |
19 |
$cp_general_name = get_post_meta($post->ID, 'cp_general_name', true); |
20 |
$cp_singular_name = get_post_meta($post->ID, 'cp_singular_name', true); |
21 |
$cp_add_new = get_post_meta($post->ID, 'cp_add_new', true); |
22 |
$cp_add_new_item = get_post_meta($post->ID, 'cp_add_new_item', true); |
23 |
$cp_edit_item = get_post_meta($post->ID, 'cp_edit_item', true); |
24 |
$cp_new_item = get_post_meta($post->ID, 'cp_new_item', true); |
25 |
$cp_all_items = get_post_meta($post->ID, 'cp_all_items', true); |
26 |
$cp_view_item = get_post_meta($post->ID, 'cp_view_item', true); |
27 |
$cp_search_items = get_post_meta($post->ID, 'cp_search_items', true); |
28 |
$cp_not_found = get_post_meta($post->ID, 'cp_not_found', true); |
29 |
$cp_not_found_in_trash = get_post_meta($post->ID, 'cp_not_found_in_trash', true); |
30 |
$cp_parent_item_colon = get_post_meta($post->ID, 'cp_parent_item_colon', true); |
31 |
|
32 |
update_post_meta($post->ID, 'cp_public', $_POST['cp_public'], $cp_public); |
33 |
update_post_meta($post->ID, 'cp_publicly_queryable', $_POST['cp_publicly_queryable'], $cp_publicly_queryable); |
34 |
update_post_meta($post->ID, 'cp_show_ui', $_POST['cp_show_ui'], $cp_show_ui); |
35 |
update_post_meta($post->ID, 'cp_show_in_menu', $_POST['cp_show_in_menu'], $cp_show_in_menu); |
36 |
update_post_meta($post->ID, 'cp_query_var', $_POST['cp_query_var'], $cp_query_var); |
37 |
update_post_meta($post->ID, 'cp_rewrite', $_POST['cp_rewrite'], $cp_rewrite); |
38 |
update_post_meta($post->ID, 'cp_has_archive', $_POST['cp_has_archive'], $cp_has_archive); |
39 |
update_post_meta($post->ID, 'cp_hierarchical', $_POST['cp_hierarchical'], $cp_hierarchical); |
40 |
update_post_meta($post->ID, 'cp_capability_type', $_POST['cp_capability_type'], $cp_capability_type); |
41 |
update_post_meta($post->ID, 'cp_menu_position', $_POST['cp_menu_position'], $cp_menu_position); |
42 |
update_post_meta($post->ID, 'cp_s_title', $_POST['cp_s_title'], $cp_s_title); |
43 |
update_post_meta($post->ID, 'cp_s_editor', $_POST['cp_s_editor'], $cp_s_editor); |
44 |
update_post_meta($post->ID, 'cp_s_author', $_POST['cp_s_author'], $cp_s_author); |
45 |
update_post_meta($post->ID, 'cp_s_thumbnail', $_POST['cp_s_thumbnail'], $cp_s_thumbnail); |
46 |
update_post_meta($post->ID, 'cp_s_excerpt', $_POST['cp_s_excerpt'], $cp_s_excerpt); |
47 |
update_post_meta($post->ID, 'cp_s_comments', $_POST['cp_s_comments'], $cp_s_comments); |
48 |
update_post_meta($post->ID, 'cp_general_name', $_POST['cp_general_name'], $cp_general_name); |
49 |
update_post_meta($post->ID, 'cp_singular_name', $_POST['cp_singular_name'], $cp_singular_name); |
50 |
update_post_meta($post->ID, 'cp_add_new', $_POST['cp_add_new'], $cp_add_new); |
51 |
update_post_meta($post->ID, 'cp_add_new_item', $_POST['cp_add_new_item'], $cp_add_new_item); |
52 |
update_post_meta($post->ID, 'cp_edit_item', $_POST['cp_edit_item'], $cp_edit_item); |
53 |
update_post_meta($post->ID, 'cp_new_item', $_POST['cp_new_item'], $cp_new_item); |
54 |
update_post_meta($post->ID, 'cp_all_items', $_POST['cp_all_items'], $cp_all_items); |
55 |
update_post_meta($post->ID, 'cp_view_item', $_POST['cp_view_item'], $cp_view_item); |
56 |
update_post_meta($post->ID, 'cp_search_items', $_POST['cp_search_items'], $cp_search_items); |
57 |
update_post_meta($post->ID, 'cp_not_found', $_POST['cp_not_found'], $cp_not_found); |
58 |
update_post_meta($post->ID, 'cp_not_found_in_trash', $_POST['cp_not_found_in_trash'], $cp_not_found_in_trash); |
59 |
update_post_meta($post->ID, 'cp_parent_item_colon', $_POST['cp_parent_item_colon'], $cp_parent_item_colon); |
60 |
}
|
Zuerst extrahieren wir die Variablen wie zuvor oben in der Meta-Box-Funktionalität und aktualisieren sie dann mit der Funktion update_post_meta, wobei wir die folgenden Parameter angeben: Post-ID, Meta-Schlüsselname, neuer Wert, alter Wert. Voila, wir haben das benutzerdefinierte Feld mit einem Wert aktualisiert. Wir müssen den Vorgang wiederholen, wie Sie im obigen Beispiel sehen, um alle Werte und alle Optionen abzudecken, die wir benötigen.
Das war's zum Speichern der Daten.
Schritt 6 Erstellen der dynamischen benutzerdefinierten Beitragstypen
Wie nehmen wir all die Daten, die wir gerade gespeichert haben, und machen sie dynamisch? Wie verwenden wir es, um benutzerdefinierte Beitragstypen zu generieren? Ganz einfach, wir fragen den Haupttyp des benutzerdefinierten Posts ab und extrahieren für jeden Loop-Post die benutzerdefinierten Felder und platzieren die Daten entsprechend im Array.
Schauen wir uns an, wie das geht. Zuerst platzieren wir diesen Code direkt unter dem Hauptcode des benutzerdefinierten Beitragstyps in der Funktion init_custom_post_types. Zunächst erstellen wir die Abfrage:
1 |
$the_query = new WP_Query(array('post_type' => array('CPT'))); |
2 |
while ($the_query->have_posts()) : $the_query->the_post(); |
Wir erstellen eine Variable mit dem Namen $the_query, in der wir den Inhalt der aufgerufenen Hauptklassenfunktion wp_query mit den Parametern eines Arrays speichern, das den Wert post_type hat, den Namen des benutzerdefinierten Hauptposttyps, nämlich CPT. Dann starten wir die Schleife. Innerhalb der Schleife generieren wir die Variablen, die die benötigten Werte enthalten sollen, indem wir sie auf dieselbe Weise wie benutzerdefinierte Felder aus der Datenbank extrahieren:
1 |
global $post; |
2 |
//*************************get the values
|
3 |
$cp_public = get_post_meta($post->ID, 'cp_public', true); |
4 |
if ($cp_public == "on") { |
5 |
$cp_public = true; |
6 |
}
|
7 |
else { |
8 |
$cp_public = false; |
9 |
}
|
10 |
$cp_publicly_queryable = get_post_meta($post->ID, 'cp_publicly_queryable', true); |
11 |
if ($cp_publicly_queryable == "on") { |
12 |
$cp_publicly_queryable = true; |
13 |
}
|
14 |
else { |
15 |
$cp_publicly_queryable = false; |
16 |
}
|
17 |
$cp_show_ui = get_post_meta($post->ID, 'cp_show_ui', true); |
18 |
if ($cp_show_ui == "on") { |
19 |
$cp_show_ui = true; |
20 |
}
|
21 |
else { |
22 |
$cp_show_ui = false; |
23 |
}
|
24 |
$cp_show_in_menu = get_post_meta($post->ID, 'cp_show_in_menu', true); // |
25 |
if ($cp_show_in_menu == "on") { |
26 |
$cp_show_in_menu = true; |
27 |
}
|
28 |
else { |
29 |
$cp_show_in_menu = false; |
30 |
}
|
31 |
$cp_query_var = get_post_meta($post->ID, 'cp_query_var', true); // |
32 |
if ($cp_query_var == "on") { |
33 |
$cp_query_var = true; |
34 |
}
|
35 |
else { |
36 |
$cp_query_var = false; |
37 |
}
|
38 |
$cp_rewrite = get_post_meta($post->ID, 'cp_rewrite', true); // |
39 |
if ($cp_rewrite == "on") { |
40 |
$cp_rewrite = true; |
41 |
}
|
42 |
else { |
43 |
$cp_rewrite = false; |
44 |
}
|
45 |
$cp_has_archive = get_post_meta($post->ID, 'cp_has_archive', true); // |
46 |
if ($cp_has_archive == "on") { |
47 |
$cp_has_archive = true; |
48 |
}
|
49 |
else { |
50 |
$cp_has_archive = false; |
51 |
}
|
52 |
$cp_hierarchical = get_post_meta($post->ID, 'cp_hierarchical', true); |
53 |
if ($cp_hierarchical == "on") { |
54 |
$cp_hierarchical = true; |
55 |
}
|
56 |
else { |
57 |
$cp_hierarchical = false; |
58 |
}
|
59 |
$cp_capability_type = get_post_meta($post->ID, 'cp_capability_type', true); |
60 |
$cp_menu_position = get_post_meta($post->ID, 'cp_menu_position', true); |
61 |
$cp_s_title = get_post_meta($post->ID, 'cp_s_title', true); |
62 |
if ($cp_s_title == "on") { |
63 |
$cp_s[] = 'title'; |
64 |
}
|
65 |
$cp_s_editor = get_post_meta($post->ID, 'cp_s_editor', true); |
66 |
if ($cp_s_editor == "on") { |
67 |
$cp_s[] = 'editor'; |
68 |
}
|
69 |
$cp_s_author = get_post_meta($post->ID, 'cp_s_author', true); |
70 |
if ($cp_s_author == "on") { |
71 |
$cp_s[] = 'author'; |
72 |
}
|
73 |
$cp_s_thumbnail = get_post_meta($post->ID, 'cp_s_thumbnail', true); |
74 |
if ($cp_s_thumbnail == "on") { |
75 |
$cp_s[] = 'thumbnail'; |
76 |
}
|
77 |
$cp_s_excerpt = get_post_meta($post->ID, 'cp_s_excerpt', true); |
78 |
if ($cp_s_excerpt == "on") { |
79 |
array_push($cp_s, 'excerpt'); |
80 |
}
|
81 |
$cp_s_comments = get_post_meta($post->ID, 'cp_s_comments', true); |
82 |
if ($cp_s_comments == "on") { |
83 |
array_push($cp_s, 'comments'); |
84 |
}
|
85 |
$cp_general_name = get_post_meta($post->ID, 'cp_general_name', true); |
86 |
$cp_singular_name = get_post_meta($post->ID, 'cp_singular_name', true); |
87 |
$cp_add_new = get_post_meta($post->ID, 'cp_add_new', true); |
88 |
$cp_add_new_item = get_post_meta($post->ID, 'cp_add_new_item', true); |
89 |
$cp_edit_item = get_post_meta($post->ID, 'cp_edit_item', true); |
90 |
$cp_new_item = get_post_meta($post->ID, 'cp_new_item', true); |
91 |
$cp_all_items = get_post_meta($post->ID, 'cp_all_items', true); |
92 |
$cp_view_item = get_post_meta($post->ID, 'cp_view_item', true); |
93 |
$cp_search_items = get_post_meta($post->ID, 'cp_search_items', true); |
94 |
$cp_not_found = get_post_meta($post->ID, 'cp_not_found', true); |
95 |
$cp_not_found_in_trash = get_post_meta($post->ID, 'cp_not_found_in_trash', true); |
96 |
$cp_parent_item_colon = get_post_meta($post->ID, 'cp_parent_item_colon', true); |
Da wir uns jetzt in der Abfrageschleife befinden, können wir eine globale Variable $post verwenden, um die benötigte ID abzurufen. Möglicherweise haben Sie auch einige Bedingungen bemerkt, die von einem if hier und da für die meisten Variablen festgelegt wurden. Diese existieren, weil der wahre Boolesche Wert oder bestimmte andere Zeichenfolgenwerte korrekt von der "on" -String, die sie darstellen, in den true Booleschen Wert konvertiert werden müssen, den sie sein müssen.
Nachdem dies alles erledigt ist, werden wir die Variablen in das Array der dynamischen Implementierung des benutzerdefinierten Beitragstyps einfügen:
1 |
$labels = array( |
2 |
'name' => _x(get_the_title($post->ID), 'post type general name'), |
3 |
'singular_name' => _x($cp_singular_name, 'post type singular name'), |
4 |
'add_new' => _x($cp_add_new, get_the_title($post->ID)), |
5 |
'add_new_item' => __($cp_add_new_item), |
6 |
'edit_item' => __($cp_edit_item), |
7 |
'new_item' => __($cp_new_item), |
8 |
'all_items' => __($cp_all_items), |
9 |
'view_item' => __($cp_view_item), |
10 |
'search_items' => __($cp_search_items), |
11 |
'not_found' => __($cp_not_found), |
12 |
'not_found_in_trash' => __($cp_not_found_in_trash), |
13 |
'parent_item_colon' => __($cp_parent_item_colon), |
14 |
'menu_name' => __(get_the_title($post->ID)) |
15 |
);
|
16 |
|
17 |
$args = array( |
18 |
'labels' => $labels, |
19 |
'public' => $cp_public, |
20 |
'publicly_queryable' => $cp_publicly_queryable, |
21 |
'show_ui' => $cp_show_ui, |
22 |
'show_in_menu' => $cp_show_in_menu, |
23 |
'query_var' => $cp_query_var, |
24 |
'rewrite' => $cp_rewrite, |
25 |
'capability_type' => 'post', |
26 |
'has_archive' => $cp_has_archive, |
27 |
'hierarchical' => $cp_hierarchical, |
28 |
'menu_position' => $cp_menu_position, |
29 |
'supports' => $cp_s |
30 |
);
|
31 |
register_post_type(get_the_title($post->ID), $args); |
32 |
endwhile; |
Der Post-Titel wird als Hauptname des benutzerdefinierten Post-Typs und die Meta-Box-Einstellungen als Rest der Eigenschaften verwendet. Das ist alles, alles, was benötigt wird, um die dynamischen benutzerdefinierten Beitragstypen in WordPress zu implementieren. Was Sie vielleicht bemerkt haben, ist, dass wir die Schleife auch am Ende des vorherigen Codes schließen.
Abschluss
Benutzerdefinierte Post-Typen sind nicht schwer zu handhaben und in allen Funktionen, die Sie möglicherweise auch mit anderen Hooks, Filtern oder benutzerdefinierten Funktionen benötigen, ziemlich flexibel. In diesem Tutorial haben wir es geschafft, eine bestimmte dynamische Implementierung der benutzerdefinierten Post-Typ-Verwaltung in einem einzigen Plugin zu behandeln, das mit Code und Dateien für Ihre Anforderungen erläutert wird. Natürlich beschränkt sich die Verwendung eines benutzerdefinierten Beitragstyps nicht auf diese Beispiele, da er in vielen Arten von Implementierungen, Plugins und Themen verwendet werden kann, die in vielen Hooks verwickelt sind, auf unterschiedliche Weise abgefragt, gefiltert oder auf viele Arten manipuliert werden.



