Anpassad WordPress-kategoriredigeringssida
Att lägga till ytterligare metaboxar, fält och annan information till WordPress är enkelt om du känner till de rätta krokarna och de rätta API:erna att följa. Men vad händer om du vill lägga till information till en WordPress taxonomisida?
Säg till exempel att du vill skapa en anpassad WordPress-kategoriredigeringssida eller åtminstone lägga till lite anpassad information på en taxonomisida?
Det är fortfarande möjligt att göra det, och det är fortfarande relativt enkelt men, återigen, du måste känna till de rätta krokarna att använda, och det beror också på om du arbetar med de inbyggda taxonomierna eller en anpassad taxonomi.
För det här inlägget kommer jag att visa hur man gör detta med hjälp av en anpassad, hierarkisk taxonomi (eller, i enklare termer, en anpassad kategori).
Anpassad WordPress-kategoriredigeringssida
För det första, om du väljer att arbeta med en standardkategorisida kommer du sannolikt att se något i stil med detta:
Och de två krokarna som du måste arbeta med är:
Om du har klickat på någon av länkarna kommer du att märka att den senare inte har någon information men den förra lyder:
Handlingen/kroken edit_category_form kan användas för att utföra ytterligare åtgärder på skärmen för redigering av kategori. Du kan till exempel lägga till formulärfält för att spara ytterligare information för en viss kategori.
För det ändamålet väljer jag i allmänhet att använda den kroken eftersom den är väldefinierad i Codex. I det här inlägget är jag dock bara bekymrad över att återge information – inte med att lägga till ytterligare fält som behöver sparas.
Koppla upp saker och ting
I den enklaste formen är det bästa sättet att börja lägga till anpassad information till den här typen av sida att skapa en funktion och bifoga den till kroken som anges ovan. I sin mest grundläggande form ser detta ut ungefär så här:
<?php
add_action('edit_category_form', 'acme_display_object_ids');
/**
* Displays an ordered list of all of the object IDs for a given
* taxonomy.
*/
function acme_display_object_ids()
{
// Code for displaying the Object IDs goes here.
}
Men om du går den objektorienterade vägen kan du välja att ha en klass som accepterar en krok som ett argument i konstruktorn och lyssnar efter att händelsen avfyras. Om så är fallet kan din kod se ut så här:
<?php
class ObjectIdSubscriber
{
/**
* @var string the hook to which this class subscribes
*/
private $hook;
/**
* @param string $hook the hook to which this class is registered with WordPress
*/
public function __construct(string $hook)
{
$this->hook = $hook;
}
/**
* Renders all of the information for the object IDs.
*/
public function load()
{
// Code for displaying the Object IDs goes here.
}
}
Oavsett, poängen är att du måste ha en klass eller en funktion som är kopplad till en krok som återger information när skärmen visas.
Visar information
Härifrån kommer du att behöva något att återge. Jag är ett fan av att hålla min logik åtskild, så jag brukar skapa en View- katalog och sedan placera de partiella filerna för vyerna i den katalogen.
Naturligtvis kan du alltid bygga strängen HTML i PHP-funktionen (men se till att du sanerar utdata med något som wp_kses ).
För det här exemplet ska jag hålla det enkelt: jag vill bara dra en lista över alla inlägg (eller objekt, som du kommer att se för en stund) från databasen och lista informationen på sidan. För att göra detta behöver jag ett par databasfrågor, och sedan kan jag iterera genom listan med resultat.
Först behöver jag en fråga som kommer att hämta term_taxonomi_id från den givna kategorin:
<?php
// This will retrieve all of the term relationships from where we can get post IDs.
global $wpdb;
$termTaxonomyId = $wpdb->get_results(
$wpdb->prepare(
"
SELECT DISTINCT term_taxonomy_id
FROM $wpdb->term_taxonomy
WHERE term_id = %s
",
$tagId
),
ARRAY_A
);
$termTaxonomyId = isset($termTaxonomyId[0])? $termTaxonomyId[0]: null;
if (null === $termTaxonomyId) {
return null;
}
Sedan måste jag hämta en lista över alla objekt-ID :n som är relaterade till detta term_taxonomi_id :
<?php
// This will retrieve all of the post IDs.
$postIds = $wpdb->get_results(
$wpdb->prepare(
"
SELECT object_id
FROM $wpdb->term_relationships
WHERE term_taxonomy_id = %s
",
$termTaxonomyId
),
ARRAY_A
);
if (empty($postIds)) {
return null;
}
Härifrån kan jag sedan använda den ursprungliga funktionen (eller klassen) som jag skapade tidigare för att återge informationen :
<ul>
<?php foreach ($postIds as $postId): ?>
<li><?php echo $postId; ?></li>
<?php endforeach; ?>
</ul>
Men det finns massor av ytterligare saker du kan göra därifrån.
Det finns mer
Som nämnts returnerar detta ID:n för objekten som i huvudsak är post-ID:n (eller sid-ID:n eller anpassade posttyp-ID:n eller vad som helst från wp_posts- tabellen).
När du har den informationen kan du hämta all information som titel, innehåll, metadata, olika datuminformation och så vidare.
Meningen med inlägget är dock inte att visa vilken information som ska hämtas utan hur man hämtar information för en given taxonomi och sedan renderar den på en anpassad WordPress-kategorisida. Och det här är ett enkelt sätt att göra exakt det.
