Ich habe einen benutzerdefinierten Beitragstyp mit dem Namen erstellt 'listing'
und eine benutzerdefinierte Taxonomie mit dem Namen hinzugefügt 'businesses'
. Ich möchte der Admin-Liste für die Listings eine Dropdown-Liste mit Unternehmen hinzufügen.
So sieht diese Funktionalität in der Admin-Liste für Posts aus (ich möchte dasselbe für meinen benutzerdefinierten Post-Typ):
Hier ist mein aktueller Code ( und hier ist derselbe Code auf Gist. ):
<?php
/*
Plugin Name: Listing Content Item
Plugin URI:
Description:
Author:
Version: 1.0
Author URI:
*/
class Listing {
var $meta_fields = array("list-address1","list-address2","list-country","list-province","list-city","list-postcode","list-firstname","list-lastname","list-website","list-mobile","list-phone","list-fax","list-email", "list-profile", "list-distributionrange", "list-distributionarea");
public function loadStyleScripts() {
$eventsURL = trailingslashit( WP_PLUGIN_URL ) . trailingslashit( plugin_basename( dirname( __FILE__ ) ) ) . 'css/';
wp_enqueue_style('listing-style', $eventsURL.'listing.css');
}
function Listing() {
// Register custom post types
register_post_type('listing', array(
'labels' => array(
'name' => __('Listings'), 'singular_name' => __( 'Listing' ),
'add_new' => __( 'Add Listing' ),
'add_new_item' => __( 'Add New Listing' ),
'edit' => __( 'Edit' ),
'edit_item' => __( 'Edit Listing' ),
'new_item' => __( 'New Listing' ),
'view' => __( 'View Listing' ),
'view_item' => __( 'View Listing' ),
'search_items' => __( 'Search Listings' ),
'not_found' => __( 'No listings found' ),
'not_found_in_trash' => __( 'No listings found in Trash' ),
'parent' => __( 'Parent Listing' ),
),
'singular_label' => __('Listing'),
'public' => true,
'show_ui' => true, // UI in admin panel
'_builtin' => false, // It's a custom post type, not built in
'_edit_link' => 'post.php?post=%d',
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => array("slug" => "listings"), // Permalinks
'query_var' => "listings", // This goes to the WP_Query schema
'supports' => array('title','editor')
));
add_filter("manage_edit-listing_columns", array(&$this, "edit_columns"));
add_action("manage_posts_custom_column", array(&$this, "custom_columns"));
// Register custom taxonomy
#Businesses
register_taxonomy("businesses", array("listing"), array(
"hierarchical" => true,
"label" => "Listing Categories",
"singular_label" => "Listing Categorie",
"rewrite" => true,
));
# Region
register_taxonomy("regions", array("listing"), array(
'labels' => array(
'search_items' => __( 'Search Regions' ),
'popular_items' => __( 'Popular Regions' ),
'all_items' => __( 'All Regions' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Edit Region' ),
'update_item' => __( 'Update Region' ),
'add_new_item' => __( 'Add New Region' ),
'new_item_name' => __( 'New Region Name' ),
'separate_items_with_commas' => __( 'Separate regions with commas' ),
'add_or_remove_items' => __( 'Add or remove regions' ),
'choose_from_most_used' => __( 'Choose from the most used regions' ),
),
"hierarchical" => false,
"label" => "Listing Regions",
"singular_label" => "Listing Region",
"rewrite" => true,
));
# Member Organizations
register_taxonomy("organizations", array("listing"), array(
'labels' => array(
'search_items' => __( 'Search Member Organizations' ),
'popular_items' => __( 'Popular Member Organizations' ),
'all_items' => __( 'All Member Organizations' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Edit Member Organization' ),
'update_item' => __( 'Update Member Organization' ),
'add_new_item' => __( 'Add New Member Organization' ),
'new_item_name' => __( 'New Member Organization Name' ),
'separate_items_with_commas' => __( 'Separate member organizations with commas' ),
'add_or_remove_items' => __( 'Add or remove member organizations' ),
'choose_from_most_used' => __( 'Choose from the most used member organizations' ),
),
"hierarchical" => false,
"label" => "Member Organizations",
"singular_label" => "Member Organization",
"rewrite" => true,
));
# Retail Products
register_taxonomy("retails", array("listing"), array(
'labels' => array(
'search_items' => __( 'Search Retail Products' ),
'popular_items' => __( 'Popular Retail Products' ),
'all_items' => __( 'All Retail Products' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Edit Retail Product' ),
'update_item' => __( 'Update Retail Product' ),
'add_new_item' => __( 'Add New Retail Product' ),
'new_item_name' => __( 'New Retail Product Name' ),
'separate_items_with_commas' => __( 'Separate retail products with commas' ),
'add_or_remove_items' => __( 'Add or remove retail products' ),
'choose_from_most_used' => __( 'Choose from the most used retail products' ),
),
"hierarchical" => false,
"label" => "Retail Products",
"singular_label" => "Retail Product",
"rewrite" => true,
));
# Farming Practices
register_taxonomy("practices", array("listing"), array(
'labels' => array(
'search_items' => __( 'Search Farming Practices' ),
'popular_items' => __( 'Popular Farming Practices' ),
'all_items' => __( 'All Farming Practices' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Edit Farming Practice' ),
'update_item' => __( 'Update Farming Practice' ),
'add_new_item' => __( 'Add New Farming Practice' ),
'new_item_name' => __( 'New Farming Practice Name' ),
'separate_items_with_commas' => __( 'Separate farming practices with commas' ),
'add_or_remove_items' => __( 'Add or remove farming practices' ),
'choose_from_most_used' => __( 'Choose from the most used farming practices' ),
),
"hierarchical" => false,
"label" => "Farming Practices",
"singular_label" => "Farming Practice",
"rewrite" => true,
));
# Products
register_taxonomy("products", array("listing"), array(
'labels' => array(
'search_items' => __( 'Search Products' ),
'popular_items' => __( 'Popular Products' ),
'all_items' => __( 'All Products' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Edit Product' ),
'update_item' => __( 'Update Product' ),
'add_new_item' => __( 'Add New Product' ),
'new_item_name' => __( 'New Product Name' ),
'separate_items_with_commas' => __( 'Separate products with commas' ),
'add_or_remove_items' => __( 'Add or remove products' ),
'choose_from_most_used' => __( 'Choose from the most used products' ),
),
"hierarchical" => false,
"label" => "Products",
"singular_label" => "Product",
"rewrite" => true,
));
// Admin interface init
add_action("admin_init", array(&$this, "admin_init"));
add_action("template_redirect", array(&$this, 'template_redirect'));
// Insert post hook
add_action("wp_insert_post", array(&$this, "wp_insert_post"), 10, 2);
}
function edit_columns($columns) {
$columns = array(
"cb" => "<input type=\"checkbox\" />",
"title" => "Business Name",
"description" => "Description",
"list-personal" => "Personal Information",
"list-location" => "Location",
"list-categorie" => "Categorie",
);
return $columns;
}
function custom_columns($column) {
global $post;
switch ($column) {
case "description":
the_excerpt();
break;
case "list-personal":
$custom = get_post_custom();
if(isset($custom["list-firstname"][0])) echo $custom["list-firstname"][0]."<br />";
if(isset($custom["list-lastname"][0])) echo $custom["list-lastname"][0]."<br />";
if(isset($custom["list-email"][0])) echo $custom["list-email"][0]."<br />";
if(isset($custom["list-website"][0])) echo $custom["list-website"][0]."<br />";
if(isset($custom["list-phone"][0])) echo $custom["list-phone"][0]."<br />";
if(isset($custom["list-mobile"][0])) echo $custom["list-mobile"][0]."<br />";
if(isset($custom["list-fax"][0])) echo $custom["list-fax"][0];
break;
case "list-location":
$custom = get_post_custom();
if(isset($custom["list-address1"][0])) echo $custom["list-address1"][0]."<br />";
if(isset($custom["list-address2"][0])) echo $custom["list-address2"][0]."<br />";
if(isset($custom["list-city"][0])) echo $custom["list-city"][0]."<br />";
if(isset($custom["list-province"][0])) echo $custom["list-province"][0]."<br />";
if(isset($custom["list-postcode"][0])) echo $custom["list-postcode"][0]."<br />";
if(isset($custom["list-country"][0])) echo $custom["list-country"][0]."<br />";
if(isset($custom["list-profile"][0])) echo $custom["list-profile"][0]."<br />";
if(isset($custom["list-distributionrange"][0])) echo $custom["list-distributionrange"][0]."<br />";
if(isset($custom["list-distributionarea"][0])) echo $custom["list-distributionarea"][0];
break;
case "list-categorie":
$speakers = get_the_terms(0, "businesses");
$speakers_html = array();
if(is_array($speakers)) {
foreach ($speakers as $speaker)
array_push($speakers_html, '<a href="' . get_term_link($speaker->slug, 'businesses') . '">' . $speaker->name . '</a>');
echo implode($speakers_html, ", ");
}
break;
}
}
// Template selection
function template_redirect() {
global $wp;
if (isset($wp->query_vars["post_type"]) && ($wp->query_vars["post_type"] == "listing")) {
include(STYLESHEETPATH . "/listing.php");
die();
}
}
// When a post is inserted or updated
function wp_insert_post($post_id, $post = null) {
if ($post->post_type == "listing") {
// Loop through the POST data
foreach ($this->meta_fields as $key) {
$value = @$_POST[$key];
if (empty($value)) {
delete_post_meta($post_id, $key);
continue;
}
// If value is a string it should be unique
if (!is_array($value)) {
// Update meta
if (!update_post_meta($post_id, $key, $value)) {
// Or add the meta data
add_post_meta($post_id, $key, $value);
}
}
else
{
// If passed along is an array, we should remove all previous data
delete_post_meta($post_id, $key);
// Loop through the array adding new values to the post meta as different entries with the same name
foreach ($value as $entry)
add_post_meta($post_id, $key, $entry);
}
}
}
}
function admin_init() {
// Custom meta boxes for the edit listing screen
add_meta_box("list-pers-meta", "Personal Information", array(&$this, "meta_personal"), "listing", "normal", "low");
add_meta_box("list-meta", "Location", array(&$this, "meta_location"), "listing", "normal", "low");
}
function meta_personal() {
global $post;
$custom = get_post_custom($post->ID);
if(isset($custom["list-firstname"][0])) $first_name = $custom["list-firstname"][0];else $first_name = '';
if(isset($custom["list-lastname"][0])) $last_name = $custom["list-lastname"][0];else $last_name = '';
if(isset($custom["list-website"][0])) $website = $custom["list-website"][0];else $website = '';
if(isset($custom["list-phone"][0])) $phone = $custom["list-phone"][0];else $phone = '';
if(isset($custom["list-mobile"][0])) $mobile = $custom["list-mobile"][0];else $mobile = '';
if(isset($custom["list-fax"][0])) $fax = $custom["list-fax"][0];else $fax = '';
if(isset($custom["list-email"][0])) $email = $custom["list-email"][0];else $email = '';
?>
<div class="personal">
<table border="0" id="personal">
<tr><td class="personal_field"><label>Firstname:</label></td><td class="personal_input"><input name="list-firstname" value="<?php echo $first_name; ?>" /></td></tr>
<tr><td class="personal_field"><label>Lastname:</label></td><td class="personal_input"><input name="list-lastname" value="<?php echo $last_name; ?>" /></td></tr>
<tr><td class="personal_field"><label>Email:</label></td><td class="personal_input"><input name="list-email" value="<?php echo $email; ?>" size="40"/></td></tr>
<tr><td class="personal_field"><label>Website:</label></td><td class="personal_input"><input name="list-website" value="<?php echo $website; ?>" size="40"/></td></tr>
<tr><td class="personal_field"><label>Phone:</label></td><td class="personal_input"><input name="list-phone" value="<?php echo $phone; ?>" /></td></tr>
<tr><td class="personal_field"><label>Mobile:</label></td><td class="personal_input"><input name="list-mobile" value="<?php echo $mobile; ?>" /></td></tr>
<tr><td class="personal_field"><label>Fax:</label></td><td class="personal_input"><input name="list-fax" value="<?php echo $fax; ?>" /></td></tr>
</table>
</div>
<?php
}
// Admin post meta contents
function meta_location() {
global $post;
$custom = get_post_custom($post->ID);
if(isset($custom["list-address1"])) $address1 = $custom["list-address1"][0];else $address1 = '';
if(isset($custom["list-address2"])) $address2 = $custom["list-address2"][0];else $address2 = '';
if(isset($custom["list-country"])) $country = $custom["list-country"][0];else $country = '';
if(isset($custom["list-province"])) $province = $custom["list-province"][0];else $province = '';
if(isset($custom["list-city"])) $city = $custom["list-city"][0];else $city = '';
if(isset($custom["list-postcode"])) $post_code = $custom["list-postcode"][0];else $post_code = '';
if(isset($custom["list-profile"])) $profile = $custom["list-profile"][0];else $profile = '';
if(isset($custom["list-distributionrange"])) $distribution_range = $custom["list-distributionrange"][0];else $distribution_range = '';
if(isset($custom["list-distributionarea"])) $distribution_area = $custom["list-distributionarea"][0];else $ddistribution_area = '';
?>
<div class="location">
<table border="0" id="location">
<tr><td class="location_field"><label>Address 1:</label></td><td class="location_input"><input name="list-address1" value="<?php echo $address1; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>Address 2:</label></td><td class="location_input"><input name="list-address2" value="<?php echo $address2; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>City:</label></td><td class="location_input"><input name="list-city" value="<?php echo $city; ?>" /></td></tr>
<tr><td class="location_field"><label>Province:</label></td><td class="location_input"><input name="list-province" value="Ontario" readonly /></td></tr>
<tr><td class="location_field"><label>Postal Code:</label></td><td class="location_input"><input name="list-postcode" value="<?php echo $post_code; ?>" /></td></tr>
<tr><td class="location_field"><label>Country:</label></td><td class="location_input"><input name="list-country" value="Canada" readonly /></td></tr>
<tr><td class="location_field"><label>Profile:</label></td><td class="location_input"><input name="list-profile" value="<?php echo $profile; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>Distribution Range:</label></td><td class="location_input"><input name="list-distributionrange" value="<?php echo $distribution_range; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>Distribution Area:</label></td><td class="location_input"><input name="list-distributionarea" value="<?php echo $distribution_area; ?>" size="60" /></td></tr>
</table>
</div>
<?php
}
}
// Initiate the plugin
add_action("init", "ListingInit");
function ListingInit() {
global $listing;
$listing = new Listing();
$add_css = $listing->loadStyleScripts();
}
Wie kann ich der Admin-Liste für die Listings eine Dropdown-Liste mit Unternehmen hinzufügen?
plugins
custom-post-types
wp-admin
Taras Mankovski
quelle
quelle
Antworten:
UPDATE: Ich habe eine neue vollständige Antwort eingefügt, aber trotzdem habe ich meine ursprüngliche Antwort unten hinterlassen, auf die sich die ersten Kommentare beziehen.
Hallo @tarasm :
Obwohl ich sagte, dass es nicht schwer sein sollte, ist es ein wenig involviert. Aber bevor wir uns mit dem Code befassen ...
Die Screenshots:
... sehen wir uns ein paar Screenshots zum fertigen Produkt an:
Listings Listenseite ohne Filterung:
(Quelle: mikeschinkel.com )
Listings Listenseite mit Filterung:
(Quelle: mikeschinkel.com )
Der Code
Also los geht's ... ( Hinweis: Ich habe eine Singularform für den Taxonomienamen von verwendet
business
. Ich hoffe, dass sie zu Ihrer passt. Aufgrund der langjährigen Erfahrung sowohl mit WordPress als auch mit der Datenbankentwicklung halte ich es für das Beste, dies auf diese Weise zu tun .)Schritt 1: Der
restrict_manage_posts
Aktionshaken.Als Erstes müssen Sie die
restrict_manage_posts
Aktion/wp-admin/edit.php
einbinden, die keine Parameter hat und von der aus aufgerufen wird (in Version 3.0.1 befindet sich dieser Aufruf in Zeile 378). Auf diese Weise können Sie die Dropdown-Auswahl an der entsprechenden Stelle über der Liste von generieren Beiträge auflisten.Wir beginnen damit, die
$typenow
Variable zu überprüfen , um sicherzustellen, dass wir tatsächlich auf einempost_type
von sindlisting
. Wenn Sie dies nicht tun, wird dieses Dropdown-Menü für alle Beitragstypen angezeigt. In einigen Fällen ist dies das, was Sie möchten, in diesem Fall jedoch nicht.Als nächstes laden wir Informationen über die Geschäftstaxonomie mit
get_taxonomy()
. Wir brauchen es, um das Label für die Taxonomie abzurufen (dh " Unternehmen "; wir hätten es hart codieren können, aber das ist nicht sehr gut, wenn Sie es später internationalisieren müssen.) Dann rufen wirwp_dropdown_categories()
alle entsprechenden Argumente im$args
Array auf, um das zu generieren Dropdown-ListeAber was sind die passenden Argumente? Schauen wir uns jedes einzeln an:
show_optional_all
- Ganz einfach, es ist das, was zuerst in der Dropdown-Liste angezeigt wird und wenn keine Filterung angewendet wurde. In unserem Fall ist es "Show All Businesses ", aber wir hätten es auch "Listings for All Businesses" oder was auch immer Sie wollen nennen können.taxonomy
- Dieses Argument teilt der Funktion mit, aus welcher Taxonomie Terme abgerufen werden sollen, obwohl die Funktioncategories
im Namen enthalten ist. In v2.8 und früheren Versionen hatte WordPress keine benutzerdefinierten Taxonomien, aber als sie hinzugefügt wurden, entschied das Team, dass es einfacher sein würde, dieser Funktion ein Taxonomieargument hinzuzufügen, als eine andere Funktion mit einem anderen Namen zu erstellen.name
- Mit diesem Argument können Sie den Wert angeben, den WordPress für dasname
Attribut des <select> -Elements verwendet, das für die Dropdown-Liste generiert wurde. Nur für den Fall, dass es nicht offensichtlich ist, ist dies auch der Wert, der bei der Filterung in der URL verwendet wird.orderby
- Dieses Argument teilt WordPress mit, wie die Ergebnisse alphabetisch sortiert werden sollen. In unserem Fall haben wir angegeben,name
die Begriffe in der Taxonomie zu bestellen , dh die Firmennamen in diesem Fall.selected
- Dieses Argument wird benötigt, damit das Dropdown-Menü den aktuellen Filter im Dropdown-Menü anzeigt. Es sollte derterm_id
von der gewählten Taxonomie abgeleitete Begriff sein. In unserem Fall könnte es dasterm_id
von "Business # 2" sein . Woher bekommen wir diesen Wert? Aus der globalen Variablen von WordPress$wp_query
; Es hat eine Eigenschaftquery
, die ein Array aller URL-Parameter und ihrer Werte enthält (es sei denn, ein eigenwilliges Plugin hat es bereits geändert). Wenn WordPress die Dinge verarbeitet, wird einterm
URL-Parameter an die URL übergeben, wenn der Benutzer auf den Filter klickt Schaltfläche, wenn der Benutzer einen gültigen Begriff ausgewählt hat (dh eines der aufgelisteten Unternehmen).hierarchical
- Indemtrue
Sie diese Option auf setzen, weisen Sie die Funktion an, die hierarchische Struktur der Taxonomie zu berücksichtigen und diese in einer Baumansicht anzuzeigen, wenn die Begriffe (Unternehmen) tatsächlich untergeordnet sind. Unten sehen Sie einen Screenshot, um zu sehen, wie dies aussieht.depth
- Dieses Argument arbeitet mit demhierarchical
Argument zusammen, um zu bestimmen, in wie vielen Ebenen die Funktion untergeordnete Elemente anzeigen soll.show_count
- Wenntrue
dieses Argument eine Anzahl von Einträgen in Klammern links vom Termnamen in der Dropdown-Liste anzeigt. In diesem Fall wird die Anzahl der mit einem Unternehmen verknüpften Einträge angezeigt. Unten sehen Sie einen Screenshot, um zu sehen, wie dies aussieht.hide_empty
- Wenn es in der Taxonomie schließlich Begriffe gibt, die keinem Eintrag zugeordnet sind (dh Unternehmen, die keinem Eintrag zugeordnet sind),true
werden sie nicht in die Dropdown- Liste aufgenommen , wenn diese Einstellung auf gesetzt wird.(Quelle: mikeschinkel.com )
Schritt 2: Der
parse_query
Filterhaken.Als nächstes wenden wir uns dem
parse_query
Filter-Hook zu, der einen Parameter ($query
) hat und von/wp-includes/query.php
(in Version 3.0.1 ist dieser Aufruf in Zeile 1549) aufgerufen wird. Er wird aufgerufen, wenn WordPress die URL überprüft und alle entsprechenden Werte in der aktuellen Version festgelegt hat aktiv,$wp_query
einschließlich Dinge wie$wp_query->is_home
und$wp_query->is_author
usw.Nachdem der
parse_query
Filter-Hook ausgeführt wurde, ruft WordPressget_posts()
eine Liste mit Beiträgen auf, die auf den Angaben in der aktuell aktiven Liste basieren$wp_query
. Daherparse_query
ist es oft ein großartiger Ort, um WordPress dazu zu bringen, seine Meinung darüber zu ändern, welche Beiträge geladen werden sollen.In Ihrem Anwendungsfall möchten wir WordPress dazu bringen, basierend auf den ausgewählten Unternehmen zu filtern. Das heißt, nur die Listings anzuzeigen, die mit dem ausgewählten Unternehmen verknüpft sind (ich würde sagen "... nur die Listings, die vom ausgewählten Unternehmen" kategorisiert " wurden", aber das ist technisch nicht korrekt;
category
es ist eine eigene Taxonomie auf Peer-Basis mitbusiness
Ausnahme dessen, dasscategory
es in WordPress integriert undbusiness
benutzerdefiniert ist. Aber für diejenigen, die mit dem Kategorisieren von Posts vertraut sind, kann dies hilfreich sein, da sie fast identisch funktionieren. Aber ich schweife ab ...)Weiter zum Code. Das erste, was wir tun, ist, einen Verweis auf die aktuell aktiven zu nehmen
$wp_query
,query_vars
damit es bequemer ist, damit zu arbeiten, genauso wie es in der eigenenparse_query()
Funktion von WordPress gemacht wird . Im Gegensatz$wp_query->query
zu den Parametern, die zur Spiegelung der übergebenen URLs verwendet werden, wird das$wp_query->query_vars
Array zur Steuerung der Abfrage verwendet, die von WordPress ausgeführt wird und die voraussichtlich geändert wird. Wenn Sie also einen ändern müssen, ist dies der eine (zumindest denke ich , dass dies der Unterschied zwischen den beiden ist; wenn jemand etwas anderes weiß , lassen Sie es mich bitte wissen, damit ich dies aktualisieren kann!)Als nächstes testen wir, um
$pagenow
sicherzustellen, dass wir WordPress tatsächlich vom URL-Pfad laden/wp-admin/edit.php
. Wir tun dies, um zu verhindern, dass versehentlich Anfragen auf anderen Seiten vermasselt werden. Wir prüfen auch, ob wir sowohlbusiness
eintaxonomy
Element als auch einterm
Element haben. (Beachten Sietaxonomy
undterm
sind ein Paar; sie werden zusammen verwendet, um die Abfrage eines Taxonomiebegriffs zu ermöglichen. Muss beides enthalten, oder WordPress weiß nicht, welche Taxonomie überprüft werden soll.)Sie fragen
business
sich vielleicht, wie dastaxonomy
Element desquery_vars
Arrays auftaucht . Was wir in unserenparse_query
Hook geschrieben haben, löste die interne Magie von WordPress aus, die darauf wartete, als Sie diebusiness
Taxonomie " "query_var
als wahr registrierten (register_taxonomy()
kopiert den Namen der Taxonomie als " "query_var
; Sie können ihn natürlich ändern, es sei denn, Sie haben einen Konflikt es ist am besten, bei dem gleichen zu bleiben):Jetzt wurde WordPress '$ wp_query so geschrieben, dass Slugs für standardmäßige taxonomie-gefilterte Abfragen verwendet werden, nicht für Taxonomiebegriffs-IDs. Für diesen Anwendungsfall benötigen wir die folgenden Elemente, damit unsere Filterabfrage funktioniert:
Nicht diese:
Interessanterweise und leider das Dropdown-Menü, das durch
wp_dropdown_categories()
Setzen des Attributs<option>
's'value
auf den Begriff (/ business ')term_id
und nicht auf den Begriff generiert wirdslug
. Wir müssen also$wp_query->query_vars['term']
von einem numerischenterm_id
in einen String konvertieren,slug
wie im oben abgebildeten Snippet beschrieben. :Und das ist es! Mit diesen beiden Funktionen erhalten Sie die gewünschte Filterung.
ABER WARTEN, ES GIBT MEHR! :-)
Ich habe eine Spalte "Unternehmen" zu Ihrer Auflistungsliste hinzugefügt, da ich wusste, dass dies Ihre nächste Frage sein würde. Ohne eine Spalte für das, was Sie filtern, kann dies für den Endbenutzer sehr verwirrend sein. (Ich habe selbst damit gekämpft, und ich war der Kodierer!) Sie können die Spalte "Unternehmen" in den vorherigen Screenshots oben natürlich bereits sehen .
Schritt 3: Der
manage_posts_columns
Filterhaken.Um der Beitragsliste eine Spalte hinzuzufügen, müssen zwei (2) weitere Hooks aufgerufen werden. Die erste ist
manage_posts_columns
oder die posttypspezifische Versionmanage_listing_posts_columns
, die ich stattdessen aufgerufen habe. Es akzeptiert einen Parameter (posts_columns
) und wird von/wp-admin/includes/template.php
(in Version 3.0.1 ist dieser Aufruf in Zeile 623) aufgerufen :Ihre
manage_posts_columns
Hook-Funktion erhält ein Array von Spalten, wobei der Wert die angezeigte Spaltenüberschrift und der Schlüssel die interne Spaltenkennung ist. Standardspalten -IDs können Folgendes und mehr enthalten: "'cb'
,'title
",'author'
"Datum" usw.'cb'
, ist diecheckbox
Spalte und beides'title'
und'date'
bezieht sich aufpost_title
bzw.post_date
aus derwp_posts
Tabelle.'author'
Natürlich ist daspost_author
Feld, nachdem der Autorenname aus derwp_users
Tabelle abgerufen wurde .(Quelle: mikeschinkel.com )
Für den
manage_posts_columns
Hook wollen wir einfach unsere Spalte vorherbusinesses
in das$posts_columns
Array einfügen'author'
, vorausgesetzt, ein anderes Plugin wurde noch nichtauthor
aus der Liste entfernt!( Beachten Sie, wie ich geschrieben
add_businesses_column_to_listing_list()
habe, dass PHP eine einfachere Möglichkeit haben muss , einen Wert in der richtigen Reihenfolge in ein assoziatives Array einzufügen?!? Oder zumindest muss es eine Funktion in WordPress Core geben, um dies zu tun? Aber seit Google lass mich runter damit ich weiter mache was geklappt hat. Wenn jemand Alternativen vorschlägt, bin ich im Voraus sehr dankbar und dankbar!)Was uns endlich dazu bringt ...
Schritt 4: Der
manage_posts_custom_column
AktionshakenDas zweite von zwei (2)
manage_posts_custom_column
Schritten, die wir ausführen müssen, um unsere Unternehmen in der Spalte anzuzeigen, besteht darin, den Namen jedes zugeordneten Unternehmens mithilfe des Aktions-Hooks auszugeben . Dieser Hook akzeptiert zwei (2) Parameter (column_id
undpost_id
) und wird auch von/wp-admin/includes/template.php
(in Version 3.0.1 ist dieser Aufruf in Zeile 1459) aufgerufen :Dieser Hook wird für jede Spalte für jede Post (/ business) -Zeile aufgerufen. Wir überprüfen zunächst, ob wir tatsächlich nur mit dem
listing
benutzerdefinierten Beitragstyp arbeiten, und verwenden dann eineswitch
Anweisung zum Testen descolumn_id
. Ich habe gewählt,switch
weil dieser Hook oft verwendet wird, um Ausgaben für viele verschiedene Spalten zu generieren, besonders wenn wir eine Funktion für viele verschiedene Post-Typen verwenden, die ungefähr so aussehen könnten:Wenn Sie unseren Anwendungsfall etwas näher betrachten, sehen Sie die
get_the_terms()
Funktion, die einfach die Liste der Begriffe für diese Taxonomie zurückgibt (dh Unternehmen für diese Auflistung). Hier erhalten Sie den Permalink für die Front-End-Webseite des Begriffs, auf der normalerweise Beiträge aufgelistet sind, die zugeordnet sind mit dem begriff könnte das aber natürlich je nach thema und / oder installierten plugins unterschiedlich sein.Wir verwenden den Permalink, um den Begriff zu verlinken, nur weil ich Dinge gerne verlinke. Wir führen dann alle mit Hyperlinks versehenen Begriffe (/ Unternehmen) getrennt mit dem Pipe-
|
Zeichen (' ') zusammen und geben sie in den PHP-Puffer aus, der sie an den Browser / HTTP-Client des Benutzers sendet:JETZT sind wir endlich fertig.
Zusammenfassung
Zusammenfassend müssen Sie also die folgenden vier (4) Hooks verwenden, um sowohl einen Filter als auch eine verwandte Spalte auf der Seite mit der benutzerdefinierten Beitragsliste abzurufen. (Oh, das funktioniert auch mit Beiträgen und Seiten.) Dies sind:
restrict_manage_posts
Aktionshaken.parse_query
Filterhaken.manage_posts_columns
Filterhaken.manage_posts_custom_column
AktionshakenWo kann der Code heruntergeladen werden?
Aber wenn ich Sie gezwungen hätte, alles oben Genannte durchzulesen, wäre ich mit Sicherheit keine sehr nette Person, wenn ich Sie auch dazu gebracht hätte, den Code auszuprobieren, nur um ihn ausprobieren zu können! Aber im Gegensatz zu dem, was manche Leute sagen, bin ich nett. Also los geht's:
HINWEIS @tarasm : Ich enthalten Haken für ein
register_post_type()
undregister_taxonomy()
damit andere diese versuchen könnten, ohne sie neu erstellenmüssen. Sie werden diese beiden Funktionsaufrufe wahrscheinlich löschen wollen, bevor Sie dies testen.DAS ENDE
Ursprüngliche Antwort:
Hallo @tarasm :
Suchen Sie nach einem Dropdown-Menü oben wie diesem Bildschirm oder suchen Sie nach einem Dropdown-Menü pro Beitragsaufzeichnung und wenn ja, wie würden Sie davon ausgehen, dass Letzteres funktioniert?
(Quelle: mikeschinkel.com )
Wenn dies der Fall ist, sehen Sie sich diese Antwort auf die Frage an, wie Sie den Administrationsbereich eines benutzerdefinierten Wordpress-Beitragstyps nach einem benutzerdefinierten Feld sortieren können. Wenn es das ist, was Sie brauchen, kann ich weitere Einzelheiten zur Taxonomie liefern.
quelle
Ich wollte nur eine alternative Implementierung teilen. Ich hatte Mikes unglaubliches Tutorial nicht, als ich das herausgefunden habe, also ist meine Lösung etwas anders. Insbesondere werde ich Mikes Schritt Nr. 1 vereinfachen und Schritt Nr. 2 eliminieren - die anderen Schritte sind immer noch anwendbar.
In Mikes Tutorial
wp_dropdown_categories()
erspart uns die Verwendung einige manuelle Listenerstellung, erfordert jedoch einige komplizierte Änderungen an bedingten Abfragen ( Schritt 2 ), um die Verwendung von ID anstelle von Slug zu handhaben. Ganz zu schweigen von der Schwierigkeit, diesen Code zu ändern, um mit anderen Szenarien wie mehreren Taxonomiefiltern fertig zu werden.Ein anderer Ansatz besteht darin, die fehlerhaften
wp_dropdown_categories()
überhaupt nicht zu verwenden , sondern unsere eigenen Dropdown-Auswahllisten von Grund auf neu zu erstellen. Es ist nicht so kompliziert, benötigt weniger als 30 Codezeilen und erfordert kein Hookingparse_query
:Durch einfaches Einfügen der gewünschten Taxonomien in das
$filters
Array können Sie schnell mehrere Taxonomiefilter ausgeben. Sie sehen genauso aus wie in Mikes Screenshots. Anschließend können Sie mit Schritt 3 und 4 fortfahren .quelle
wp_dropdown_categories()
erfordert viele Problemumgehungen. Ich versuche, wenn möglich bei den Kernfunktionen zu bleiben, aber wie Sie hervorheben, erfordert dies manchmal mehr Arbeit. Nur um zu beweisen, dass es mit WordPress oft mehr als einen guten Weg gibt, ein Problem zu lösen. Gut gemacht!In der folgenden Version werden automatisch Filter aus allen Taxonomien erstellt und angewendet, die für alle benutzerdefinierten Beitragstypen gelten, die diese verwenden. (was für ein Schluck) Wie auch immer, ich habe es auch so optimiert, dass es mit wp_dropdown_categories () und WordPress 3.1 funktioniert. Das Projekt, an dem ich arbeite, heißt ToDo. Sie können die Funktionen in etwas umbenennen, das für Sie sinnvoll ist, aber dies sollte für alles automatisch funktionieren.
Beachten Sie, dass ich ein Plugin verwende, das 'term_order' als Methode zum Ordnen von Begriffen hinzufügt. Sie müssen dies ändern oder das Argument entfernen, um auf die Standardeinstellung zurückzugreifen.
quelle
Späte Antwort
Bearbeiten
Ich habe Filterama geschrieben , ein Plugin, das diese Funktionalität auf einfachste Weise hinzufügt.
Update für WordPress 3.5+
Jetzt, da die Dinge viel einfacher sind, gibt es hier eine sehr einfache Lösung als Plugin oder Mu-Plugin.
Es verwendet so wenig Ressourcen wie möglich, lädt nur die benötigten Bildschirme und fügt Spalten + Filter für jede benutzerdefinierte Taxonomie hinzu.
Und dann brauchen Sie nur noch eine angepasste Walker-Klasse.
quelle
$this->setup_vars();
am Anfang von verwenden,public function setup()
um zu"manage_taxonomies_for_{$this->post_type}_columns"
arbeitenadd_action( 'init', array( 'WCM_Admin_PT_List_Tax_Filter', 'init' ) );
Ich wollte nur eine kurze Notiz machen. In neueren Versionen von WP werden Post-Listings auf admin von der Klasse WP_Posts_List_Table behandelt. Der apply_filters-Code lautet nun wie folgt:
Um also neue Spalten hinzuzufügen, sollte ein add_filter-Hook folgendermaßen aussehen:
Hier ist ein Beispiel:
Nun zu den Postreihen. Dies ist der Code, der Spaltendaten in den Auflistungen verarbeitet:
Um unsere Beitragsdaten abzurufen, müssen wir einen Aktions-Hook wie diesen hinzufügen:
Beispiel (in diesem Beispiel werden Taxonomien verwendet, Sie können jedoch auch andere Dinge abfragen):
quelle
ARBEITET IN WP 3.2!
custom_post_type: books custom_taxonomy: genre
Nur ändern, wo es heißt: // HIER ändern
quelle
__("Show All {$info_taxonomy->label}")
ist jedoch eine falsche Methode, um übersetzbare Zeichenfolgen zu verwenden.Hier ist eine Möglichkeit, dies mit der Aktion restrict_manage_posts zu tun. Es scheint für mich gut zu funktionieren und bietet die Möglichkeit, nach Taxonomie für alle Beitragstypen und die damit verbundenen Taxonomien zu filtern.
Ein Hinweis: Ich habe versucht, die Tiefe einzuschränken, da einige meiner hierarchischen Taxonomien ziemlich groß sind, aber es hat nicht funktioniert. Könnte dies ein Fehler in der Funktion wp_dropdown_categories sein?
quelle
Dies ist nicht bekannt , glaube ich, aber wie von Wordpress 3.5 können Sie weitergeben
'show_admin_column' => true
zuregister_taxonomy
. Das macht 2 Dinge:Also nicht genau das Gleiche wie ein Select, aber fast die gleiche Funktionalität, nur eine Codezeile breit.
https://make.wordpress.org/core/2012/12/11/wordpress-3-5-admin-columns-for-custom-taxonomies/
Außerdem gibt es, wie Sie lesen können, einen neuen Filter, der auf das manuelle Hinzufügen von Taxonomiespalten zugeschnitten ist (falls dies wirklich erforderlich ist).
quelle
Hierarchische Version der Antwort von @somatic, wie von @kevin angefordert:
Ich habe im Grunde den Code entfernt, der die Optionen erstellt hat, und habe ihn in seine eigene Funktion eingefügt. Die Funktion 'generate_taxonomy_options' übernimmt zusätzlich zum tax_slug auch einen Parent- und Level-Parameter. Die Funktion geht davon aus, dass sie Optionen für das übergeordnete Element 0 erstellt, mit denen alle Begriffe der Stammebene ausgewählt werden. In der Schleife ruft die Funktion sich selbst rekursiv auf, wobei sie diesen aktuellen Term als übergeordnetes Element verwendet und die Ebene um eins erhöht. Es fügt automatisch Zecken zur Seite hinzu, je tiefer Sie den Baum hinuntergehen und voila!
quelle
Aktualisierung der Antwort von @Drew Gourley für WP 3.3.1 (einschließlich Code von http://wordpress.org/support/topic/wp_dropdown_categories-generating-url-id-number-instead-of-slug?replies=6#post- 2529115 ):
quelle
Entschuldigung für die Tatsache, dass ich als neuer Benutzer keine Kommentare posten kann, aber ich kann eine Antwort posten ...
Ab WordPress 3.1 (RC 1) funktioniert Mikes Antwort (die mir in den letzten Monaten so gut gedient hat) bei mir nicht mehr. Einschränkung durch ein Taxonomiekind ergibt ein leeres Ergebnis. Ich habe Somatics Update ausprobiert und es hat großartig funktioniert. Noch besser ist, dass es mit mehreren Taxonomie-Abfragen funktioniert, die in dieser Version verarbeitet wurden.
quelle
Ich habe gerade beide Codes von Mike und Somatic ausprobiert und mich gefragt, wie ich aus jeder Technik eines herausholen kann:
Mit Mikes Code wird die Dropdown-Liste mit der hierarchischen Option angezeigt , was sehr hilfreich ist . Aber um zwei Dropdowns anzuzeigen, musste ich die
if ($typenow=='produtos') {...}
Anweisung in der Funktionrestrict_listings_by_business()
und auchif ($pagenow=='edit.php' && ... }
in derconvert_business_id_to_taxonomy_term_in_query($query)
Funktion, die jetzt viel Code enthält , duplizieren .Mit dem Code von somatic muss ich nur die Taxonomien spezifizieren, die ich als Dropdowns und Bam sehen möchte, funktioniert;
$filters = array('taxo1', 'taxo2');
Frage: Kann ich mich an somatic wenden und auch die hierarchische Option haben?
Trotzdem vielen Dank für dieses Tutorial, das mir sehr geholfen hat!
quelle
Mikes Tutorial dazu ist großartig! Ich hätte mich wahrscheinlich nicht darum gekümmert, diese Funktionalität zu meinem Plugin für Medienkategorien hinzuzufügen, wenn ich es selbst herausgefunden hätte.
Trotzdem denke ich, dass
parse_query
es nicht notwendig ist, den Begriff zu verwenden und ihn dann abzufragen. Es ist übersichtlicher, wenn Sie Ihre eigene Klasse für Wanderer erstellen möchten. Vielleicht war das nicht möglich, als er seinen Beitrag schrieb - der zum Zeitpunkt meines Schreibens dieses Artikels 3 Jahre alt war.Kasse dieses große Schnipsel auf Github. Funktioniert wie ein Charm, wandelt die IDs in den Dropdown-Werten in Slugs um, sodass es nur von Haus aus funktioniert, ohne die Abfrage zu ändern.
https://gist.github.com/stephenh1988/2902509
quelle