Dodawanie do WordPressa dodatkowych meta pól, pól i innych informacji jest łatwe, jeśli znasz odpowiednie haki i odpowiednie interfejsy API. Ale co, jeśli chcesz dodać informacje do strony taksonomii WordPress?
Załóżmy na przykład, że chcesz utworzyć niestandardową stronę edycji kategorii WordPress lub przynajmniej dodać niestandardowe informacje do strony taksonomii?
Nadal można to zrobić i nadal jest to stosunkowo łatwe, ale znowu musisz znać odpowiednie hooki do użycia, a także zależy to od tego, czy pracujesz z wbudowanymi taksonomiami, czy z niestandardową taksonomią.
W tym poście pokażę, jak to zrobić, używając niestandardowej, hierarchicznej taksonomii (lub, prościej, niestandardowej kategorii).
Niestandardowa strona edycji kategorii WordPress
Po pierwsze, jeśli zdecydujesz się pracować ze standardową stroną kategorii, prawdopodobnie zobaczysz coś takiego:
A dwa haki, z którymi musisz pracować to:
Jeśli kliknąłeś któryś z linków, zauważysz, że ten drugi nie zawiera żadnych informacji, ale pierwszy brzmi:
Akcja/hak edit_category_form może być wykorzystana do wykonania dodatkowych akcji na ekranie edycji kategorii. Na przykład możesz dodać pola formularza, aby zapisać dodatkowe informacje dla określonej kategorii.
W tym celu generalnie decyduję się na użycie tego haka, ponieważ jest on dobrze zdefiniowany w Kodeksie. Jednak w tym poście zajmuję się tylko renderowaniem informacji – a nie dodawaniem dodatkowych pól, które trzeba zapisać.
Podłączanie rzeczy
W najprostszej formie najlepszym sposobem na rozpoczęcie dodawania niestandardowych informacji do tego typu strony jest utworzenie funkcji i dołączenie jej do haka wymienionego powyżej. W swojej najbardziej podstawowej formie wygląda to mniej więcej tak:
<?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.
}
Jeśli jednak pójdziesz ścieżką zorientowaną obiektowo, możesz zdecydować się na klasę, która akceptuje przechwycenie jako argument w konstruktorze i nasłuchuje tego zdarzenia. Jeśli tak jest, Twój kod może wyglądać tak:
<?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.
}
}
Niezależnie od tego, chodzi o to, że musisz mieć klasę lub funkcję, która jest podłączona do hooka, który będzie renderował informacje, gdy wyświetlany jest ekran.
Wyświetlanie informacji
Stąd będziesz potrzebował czegoś do renderowania. Jestem fanem oddzielenia mojej logiki, więc zwykle tworzę katalog View, a następnie umieszczam częściowe pliki dla widoków w tym katalogu.
Oczywiście zawsze możesz zbudować ciąg znaków HTML w funkcji PHP (ale upewnij się, że oczyściłeś dane wyjściowe za pomocą czegoś takiego jak wp_kses ).
W tym przykładzie zamierzam to uprościć: po prostu chcę pobrać listę wszystkich postów (lub obiektów, jak zobaczysz za chwilę) z bazy danych i wyświetlić informacje na stronie. Aby to zrobić, potrzebuję kilku zapytań do bazy danych, a następnie będę mógł przeglądać listę wyników.
Najpierw potrzebuję zapytania, które pobierze term_taxonomy_id z danej kategorii:
<?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;
}
Następnie muszę pobrać listę wszystkich identyfikatorów obiektów, które są powiązane z tym term_taxonomy_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;
}
Stąd mogę użyć oryginalnej funkcji (lub klasy), którą stworzyłem wcześniej, aby renderować informacje :
<ul>
<?php foreach ($postIds as $postId): ?>
<li><?php echo $postId; ?></li>
<?php endforeach; ?>
</ul>
Ale jest wiele dodatkowych rzeczy, które możesz tam zrobić.
Jest więcej
Jak wspomniano, zwraca to identyfikatory obiektów, które są zasadniczo identyfikatorami postów (lub identyfikatorami stron lub niestandardowymi identyfikatorami typu postów lub czymkolwiek z tabeli wp_posts ).
Po uzyskaniu tych informacji możesz pobrać dowolne informacje, takie jak tytuł, treść, metadane, różne informacje o dacie i tak dalej.
Celem postu nie jest jednak pokazanie, jakie informacje należy pobrać, ale jak pobrać informacje dla danej taksonomii, a następnie wyświetlić je na niestandardowej stronie kategorii WordPress. I to jest prosty sposób na zrobienie dokładnie tego.
