In dieser Serie haben wir untersucht, wie Sie ein einfaches CRM-System in WordPress erstellen können. Im ersten Teil dieser Serie haben wir ein WordPress-Plugin erstellt, das einen benutzerdefinierten Beitragstyp "Kontakte" registriert. Wir haben jedoch noch nicht beschrieben, wie Sie zusätzliche Informationen für einen Kontakt speichern können.
WordPress hat die add_meta_box ()
Diese Funktion ermöglicht Plugin- und Design-Entwicklern, benutzerdefinierte Meta-Boxen auf verschiedenen WordPress-Verwaltungsbildschirmen zu registrieren.
WordPress registriert einige seiner eigenen Meta-Boxen zur Anzeige, wenn Sie einen Beitrag oder eine Seite erstellen. Auf Seiten haben Sie beispielsweise die Seitenattribute meta box:
Fügen wir eine Meta-Box hinzu Kontakte benutzerdefinierte Postart. Öffnen Sie die Plugin-Datei, die Sie im ersten Tutorial dieser Serie erstellt haben. Aktualisieren Sie dann im Konstruktor des Plugins den Code, um ihn mit den folgenden Angaben zu vergleichen. Dies registriert unser register_meta_boxes ()
Funktion gegen die add_meta_boxes
Aktion:
/** * Konstrukteur. Wird aufgerufen, wenn das Plugin initialisiert wird * / function __construct () add_action ('init', array ($ this, 'register_custom_post_type')); add_action ('add_meta_boxes', array ($ this, 'register_meta_boxes'));
Als nächstes in unserem register_meta_boxes ()
Funktion fügen wir einen Anruf hinzu add_meta_box ()
. Dies sagt WordPress, wir wollen eine Meta-Box namens Kontakt details, was von unserem gemacht wird output_meta_box ()
Funktion. Fügen Sie nach der Konstruktorfunktion den folgenden Code hinzu:
/ ** * Registriert eine Meta-Box in unserem benutzerdefinierten Kontakttyp "Kontaktdetails". * / Funktion register_meta_boxes () add_meta_box ('Kontaktdetails', 'Kontaktdetails', Array ($ this, 'output_meta_box'), 'Kontakt', 'Normal', 'Hoch');
Schließlich brauchen wir eine output_meta_box ()
Funktion, die von aufgerufen wird add_meta_box
über. Fügen Sie den folgenden Code nach dem hinzu register_meta_boxes ()
Funktion:
/ ** * Gib eine Kontakt-Details-Meta-Box aus * * @param WP_Post $ post WordPress Post-Objekt * / function output_meta_box ($ post)
Lassen Sie uns überprüfen, dass auf unserer eine Meta-Box angezeigt wird Kontakte benutzerdefinierte Postart. Erstellen Sie einen neuen Kontakt im WordPress-Dashboard, indem Sie auf klicken Kontakte> Neu hinzufügen.
Wenn alles richtig geschrieben wurde, sollten Sie etwas ähneln, das dem folgenden Screenshot ähnelt:
Fügen Sie diesem Meta-Feld ein E-Mail-Adressfeld hinzu. Ändere dein output_meta_box
Funktion zum folgenden Code:
/ ** * Eine Meta-Box für Kontaktdetails ausgeben * * @param WP_Post $ post WordPress Post-Objekt * / function output_meta_box ($ post) // Ausgabe-Label und -Feldecho (''); Echo ('');
Speichern Sie Ihren Plugin-Code und laden Sie den Bildschirm Kontakt hinzufügen erneut. Sie sollten unser neues E-Mail-Adressfeld in der Meta-Box "Kontaktdaten" sehen:
Wir sind noch nicht ganz fertig. Wir müssen WordPress anweisen, den Inhalt zu speichern, den ein Benutzer in dieses Feld eingibt. In WordPress tun wir dies, indem wir eine Funktion gegen die registrieren save_post
Aktion.
Wie bei den meisten Aktionen registrieren wir unsere Aktion im Konstruktor des Plugins:
/** * Konstrukteur. Wird aufgerufen, wenn das Plugin initialisiert wird * / function __construct () add_action ('init', array ($ this, 'register_custom_post_type')); add_action ('add_meta_boxes', array ($ this, 'register_meta_boxes')); add_action ('save_post', array ($ this, 'save_meta_boxes'));
Als nächstes erstellen wir unsere save_meta_boxes ()
Funktion:
/ ** * Speichert die Meta-Box-Felddaten * * @param int $ post_id Beitrags-ID * / Funktion save_meta_boxes ($ post_id) // Prüfen Sie, ob dies der Typ des benutzerdefinierten Kontaktpostens ist, wenn ('contact'! = $ _POST ['post_type ']) return $ post_id; // Überprüfen Sie, ob der angemeldete Benutzer berechtigt ist, diesen Beitrag zu bearbeiten, wenn (! Current_user_can ('edit_post', $ post_id)) return $ post_id; // OK zum Speichern der Metadaten $ email = sanitize_text_field ($ _POST ['contact_email']); update_post_meta ($ post_id, '_contact_email', $ email);
Diese Funktion führt mehrere Aktionen aus, da die save_post
Diese Aktion kann von WordPress und anderen Plugins häufig aufgerufen werden (z. B. wenn ein Entwurf regelmäßig automatisch gespeichert wird oder ein anderer Beitragstyp gespeichert wird). Wir müssen sicherstellen, dass wir unsere benutzerdefinierten Felddaten nur speichern, wenn der Benutzer einen Kontakt gespeichert oder aktualisiert hat.
Wenn wir einen Kontakt speichern, wird die E-Mail-Adresse desinfiziert. Aus dem WordPress-Codex:
Überprüft, ob UTF-8 ungültig ist, Single konvertieren < characters to entity, strip all tags, remove line breaks, tabs and extra white space, strip octets.
Kurz gesagt stellen wir sicher, dass unsere Textzeichenfolge nicht funky formatiert wird.
Schließlich speichern wir die E-Mail-Adresse in den Post-Metadaten mit update_post_meta
. Stellen Sie sich Post-Meta als eine Reihe von Schlüssel / Wert-Paaren vor, die an einen Post angehängt sind. Sie können so viele oder so viele haben, wie Sie möchten. In unserem Beispiel speichern wir den Wert unseres benutzerdefinierten Felds gegen den Schlüssel _Kontakt E-mail
.
Erstelle eine neue Kontakt und geben Sie eine E-Mail-Adresse ein. Speichern Sie den neuen Kontakt und Sie werden feststellen, dass die E-Mail-Adresse nicht im Feld angezeigt wird:
Wir müssen unsere bearbeiten output_meta_box ()
Funktion, um das Post-Meta zu lesen und im Eingabefeld anzuzeigen. Ändere das output_meta_box ()
Funktion zum folgenden Code:
/ ** * Gib eine Meta-Box für Kontaktdetails aus * * @param WP_Post $ post WordPress Post-Objekt * / function output_meta_box ($ post) $ email = get_post_meta ($ post-> ID, '_contact_email', true); // Label und Feldecho ausgeben (''); Echo ('');
Wir gebrauchen get_post_meta ()
um den Wert für die angegebene Kombination aus Post-ID und Metaschlüssel zu erhalten. Wir wissen, dass der Metaschlüssel ist _Kontakt E-mail
, Dies ist das, was wir verwendet haben, als wir den benutzerdefinierten Feldwert in gespeichert haben update_post_meta ()
Sicherheit ist äußerst wichtig bei der Übermittlung und Bearbeitung von Formulardaten. Wir müssen wissen, dass die Quelle unserer Daten beim Speichern vertrauenswürdig ist. Wenn wir der Quelle unserer Daten nicht vertrauen können, dürfen wir sie nicht speichern. Die Daten können manipuliert oder beschädigt werden, um einen Fehler oder Sicherheitslücken auszunutzen.
WordPress liefert uns Nonces (eine einmal verwendete Nummer), die zusammen mit den Formulardaten gesendet werden kann. Diese Nonce kann überprüft werden, wenn unsere Sicherungsroutine ausgeführt wird, um sicherzustellen, dass sie dem erwarteten Wert entspricht.
Dies hilft, Cross-Site Request Forgery (CSRF) -Angriffe zu verhindern, d. H. Jemand, der versucht, Formulardaten von einer anderen Website an unsere Sicherungsroutine zu senden.
Wir müssen den obigen Code an zwei Stellen in Sicherheit bringen:
output_meta_box ()
: Fügen Sie dem Formular einen Nonce-Wert hinzusave_meta_boxes ()
: Überprüfen Sie einen übergebenen Nonce-WertLassen Sie uns das bearbeiten output_meta_box ()
Funktion durch den folgenden Code ersetzen:
/ ** * Gib eine Meta-Box für Kontaktdetails aus * * @param WP_Post $ post WordPress Post-Objekt * / function output_meta_box ($ post) $ email = get_post_meta ($ post-> ID, '_contact_email', true); // Fügen Sie ein Nonce-Feld hinzu, damit wir es später überprüfen können. wp_nonce_field ('save_contact', 'contact_nonce'); // Label und Feldecho ausgeben (''); Echo ('');
Dies nutzt wp_nonce_field ()
, um ein verstecktes Feld zu erzeugen contact_nonce
, mit einer Aktion aufgerufen save_contact
. Der Wert wird von WordPress generiert.
Als nächstes bearbeiten wir die Speicherroutine in save_meta_boxes ()
:
/ ** * Speichert die Meta-Box-Felddaten * * @param int $ post_id Beitrags-ID * / function save_meta_boxes ($ post_id) // Prüfen Sie, ob unser Nonce gesetzt ist. if (! isset ($ _POST ['contact_nonce'])) return $ post_id; // Vergewissern Sie sich, dass die Nonce gültig ist. if (! wp_verify_nonce ($ _POST ['contact_nonce'], 'save_contact')) return $ post_id; // Überprüfen Sie, ob dies der Typ des benutzerdefinierten Kontaktpostens ist if ('contact'! = $ _POST ['post_type']) return $ post_id; // Überprüfen Sie, ob der angemeldete Benutzer berechtigt ist, diesen Beitrag zu bearbeiten, wenn (! Current_user_can ('edit_post', $ post_id)) return $ post_id; // OK zum Speichern der Metadaten $ email = sanitize_text_field ($ _POST ['contact_email']); update_post_meta ($ post_id, '_contact_email', $ email);
Dies fügt unserer Sicherungsroutine zwei Prüfungen hinzu:
Erstellen oder bearbeiten Sie Ihre Kontakt, und vergewissern Sie sich, dass die E-Mail-Adresse jetzt gespeichert wird.
Im nächsten Artikel werden wir erweiterte benutzerdefinierte Felder verwenden, um benutzerdefinierte Felder hinzuzufügen Kontakt Benutzerdefinierter Post-Typ, mit dem wir eine reichhaltige Benutzeroberfläche mit einer größeren Auswahl an Eingabetypen erstellen können.