Hinzufügen eines benutzerdefinierten Links zum Bildschirm „Alle Posts“ basierend auf Post-Metadaten
TL;DR: Dieser Artikel beschreibt den Code, der zum Hinzufügen eines benutzerdefinierten Links auf dem Bildschirm „ Alle Beiträge “ erforderlich ist, der ein benutzerdefiniertes Stück Post-Metadaten verwendet.
Hinweis: Vor einigen Monaten habe ich einen Artikel darüber geschrieben , wie man dem Bildschirm „Alle Beiträge“ eine benutzerdefinierte Ansicht hinzufügt. Dieser Artikel ist nicht alles zusammen gleich, aber auch nicht alles zusammen verschieden. Betrachten Sie es als eine detailliertere und vielleicht praktischere Umsetzung des Konzepts.
Angenommen, Sie haben einen Standard-Beitragstyp oder einen benutzerdefinierten Beitragstyp und filtern einfach nach einer Überschrift, die Sie mithilfe eines Mechanismus definieren, mit dem Sie Daten in der post_metadataTabelle speichern können.
Nehmen wir zum Beispiel an, Sie haben einen Beitrag und ihn als Metadaten mit:
- a
meta_keymit dem Wert vonarticle_attribute - a
meta_valuemit dem Wert vonheadline
Und Sie möchten diese Informationen verwenden, um einen neuen Schlagzeilen -Link hinzuzufügen, der automatisch alles herausfiltert, außer Artikel mit diesen Metadaten.
Hier ist, wie es geht.
Benutzerdefinierter Link auf dem Bildschirm „Alle Beiträge“.
Bevor Sie beginnen, sollten Sie beachten, dass es zwei Möglichkeiten gibt, dieses Problem anzugehen:
- Wir könnten zuerst den Link oben auf der Seite „ Alle Beiträge “ hinzufügen und dann die Funktion zum Filtern der Daten als zweites hinzufügen,
- Oder wir können es umgekehrt machen, indem wir zuerst die Backend-Logik hinzufügen und dann den Link „ Alle Beiträge “ hinzufügen.
Ich werde mich entscheiden, mit der zweiten Option zu beginnen. Es gibt keinen Grund, warum es so gemacht werden muss. Es ist meine Präferenz.
Zuerst muss ich mich in den [pre_get_posts](https://developer.wordpress.org/reference/hooks/pre_get_posts/)von WordPress bereitgestellten Hook einklinken. Ich werde in diesem Beispiel keine Namespace-Klassen oder Funktionen mit Präfix verwenden (vorausgesetzt, ich habe diesen Inhalt auf dieser Website ausreichend behandelt), aber ich habe ein Demo-Plugin dafür, das am Ende des Beitrags verlinkt ist.
Wie auch immer, ich beginne damit, eine anonyme Funktion hinzuzufügen, die an den oben genannten Haken angehängt ist:
add_action(
'pre_get_posts',
function (WP_Query $query) {
}
);
Beachten Sie, dass die anonyme Funktion ein einzelnes Argument akzeptiert, das ein Verweis auf die aktuelle Instanz WP_Queryist, die auf der Seite ausgeführt wird. Wenn Sie mit dieser Klasse nicht vertraut sind, empfehle ich Ihnen, einen dieser Artikel oder die Seite mit den Entwicklerressourcen zu lesen .
In der Funktion muss ich das Vorhandensein von a meta_valuein der Abfragezeichenfolge überprüfen. [filter_input](https://www.php.net/manual/en/function.filter-input.php)Dies ist dank der von PHP bereitgestellten Funktion einfach zu bewerkstelligen.
add_action(
'pre_get_posts',
function (WP_Query $query) {
$meta_value = 'headline';
if (filter_input( INPUT_GET, 'meta_value') === $meta_value) {
$query->set( 'meta_key', 'article_attribute' );
$query->set( 'meta_value', $meta_value );
}
}
);
Dieser Hook prüft, ob der headlineWert der Schlüssel für den meta_valueSchlüssel in der Abfragezeichenfolge ist. Wenn dies der Fall ist, fügt es ein meta_keyund meta_valuezu dessen Instanz hinzu, WP_Querydas WordPress anweist, alle Beiträge mit genau diesen Metadaten abzurufen.
Danach muss ich oben auf der Seite „ Alle Beiträge “ einen Link hinzufügen, um diese Funktion auszulösen. Dazu setze ich den [views_edit-posts](https://tommcfarlin.com/add-a-custom-view/)Hook ein. Diese Funktion akzeptiert ein Array von Ankern, die oben auf der Seite angezeigt werden.
Ich beziehe mich auf diese $viewsso, dass die Funktion das akzeptiert, wenn ich sie ausdrücke:
add_action(
'views_edit-post',
function (array $views) {
return $views;
}
);
Beachten Sie, dass es wichtig ist, das Array an WordPress zurückzugeben, damit es weiß, was zu rendern ist, auch wenn keine Änderung vorgenommen wird.
Zuerst muss ich feststellen, ob ich mich derzeit auf der benutzerdefinierten Seite befinde. Wenn dies der Fall ist, muss ich dem oben auf der Seite hinzugefügten Anker die richtigen Attribute hinzufügen:
$attributes = 'class=""';
if (filter_input(INPUT_GET, 'meta_value') === 'headline') {
$attributes ='class="current aria-current="page"';
}
Danach muss ich die Schlagzeilenansicht tatsächlich zur Seite hinzufügen. Dies erfordert die Verwendung mehrerer Funktionen:
[array_push](https://www.php.net/manual/en/function.array-push.php)zum Hinzufügen eines neuen Links zur Liste von$views[sprintf](https://www.php.net/manual/en/function.sprintf.php)zum sicheren Hinzufügen einer neuen Zeichenfolge[add_query_arg](https://developer.wordpress.org/reference/functions/add_query_arg/)zum Hinzufügen eines Satzes benutzerdefinierter Abfrageargumente zur aktuellen Seite.
Der nächste Codeabschnitt sieht folgendermaßen aus:
array_push(
$views,
sprintf(
'<a href="%1$s" %2$s>%3$s
<span class="count">(%4$s)</span>
</a>
',
add_query_arg([
'post_type' => 'post',
'post_status' => 'all',
'meta_value' => 'headline',
], 'edit.php'),
$attributes
__('Headlines'),
count( );
);
Aber ich bin noch nicht fertig. Beachten Sie insbesondere, dass ich [count](https://www.php.net/manual/en/function.count.php)am Ende der Funktion einen Aufruf tätige. Dadurch kann ich die Anzahl der Posts mit diesem Attribut richtig anzeigen.
Ich werde zwei Hilfsfunktionen dafür schreiben und dann zum sizeofAufruf zurückkehren.
Hier ist eine Hilfsfunktion, um die Anzahl der Ergebnisse zu finden, die die angegebenen haben meta_keyund meta_valuedie wir für diese Art von Beitrag haben. Beachten Sie, dass ich verwende [$wpdb](https://developer.wordpress.org/reference/classes/wpdb/), um einen direkten Datenbankaufruf zu tätigen, und dass ich speziell verwende [prepare](https://developer.wordpress.org/reference%2Fclasses%2Fwpdb%2Fprepare%2F/), um sicherzustellen, dass ich dies sicher mache.
function get_headline_results(): array {
global $wpdb;
return $wpdb->get_results(
$wpdb->prepare(
"
SELECT post_id FROM $wpdb->postmeta
WHERE meta_key = %s AND meta_value = %s
",
'article_attribute',
'headline'
),
ARRAY_A
);
}
Beachten Sie, dass alle Ergebnisse (nicht nur die Zahl) zurückgegeben werden, da dieser Wert vorübergehend an eine andere Funktion übergeben wird.
An diesem Punkt könnten wir aufhören und uns einfach den Inhalt ansehen, der von der Abfrage zurückgegeben wird, aber wenn wir uns nur mit dem postBeitragstyp befassen, müssen wir dies berücksichtigen. Hier ist eine Möglichkeit, dies zu tun:
function filter_posts_from_pages( array $results ): array {
$post_ids = array();
foreach ($results as $result) {
if ('post' === get_post_type( $result['post_type'])) {
$post_ids[] = $result['post_id'];
}
}
return $post_ids;
}
Damit können wir diesen Wert an die countobige Funktion zurückgeben.
Die endgültige Version des Blocks, den wir oben gestartet haben, sollte ungefähr so aussehen:
array_push(
$views,
sprintf(
'<a href="%1$s" %2$s>%3$s <span class="count">(%4$s)</span></a>',
add_query_arg(
array(
'post_type' => 'post',
'post_status' => 'all',
'meta_value' => 'headlines',
),
'edit.php'
),
$attributes,
__( 'Headlines' ),
count(
filter_posts_from_pages( get_headline_results()) )) );
Das heißt, die vollständige Version der Funktion zum Hinzufügen einer neuen Überschrift sieht in etwa so aus:
add_action(
'views_edit-post',
function (array $views) {
$attributes = 'class=""';
if (filter_input( INPUT_GET, 'meta_value') === 'headline') {
$attributes = 'class="current aria-current="page"';
}
array_push(
$views,
sprintf(
'<a href="%1$s" %2$s>%3$s <span class="count">(%4$s)</span></a>',
add_query_arg(
array(
'post_type' => 'post',
'post_status' => 'all',
'meta_value' => 'headline',
),
'edit.php'
),
$attributes,
__( 'Headlines' ),
count(
filter_posts_from_pages( get_headline_results()) )) );
return $views;
}
);
Und wie von Anfang an erwähnt, ist dieses Plugin nicht so benannt oder organisiert, wie ich normalerweise Code schreibe. Stattdessen soll es einen Weg demonstrieren, wie man schnell etwas erreichen kann – eine Art Prototyp.
Wenn Sie also daran interessiert sind, so etwas in Aktion zu sehen, können Sie sich das Repository auf GitHub ansehen. Beachten Sie, dass dies im Moment der Entwicklungszweig ist. Denken Sie daran, sich das anzusehen, [README](https://github.com/tommcfarlin/custom-metadata-filter/blob/develop/README.md)da es Anweisungen zum Hinzufügen von Daten zur Datenbank für Beiträge enthält, damit der Headlines -Anker tatsächlich funktioniert, anstatt unbedingt einen Nullwert anzuzeigen.