He creado un Tipo de publicación personalizado llamado 'listing'
y agregué una Taxonomía personalizada llamada 'businesses'
. Me gustaría agregar una lista desplegable de empresas a la lista de administradores para los listados.
Así es como se ve esta funcionalidad en la lista de administración de publicaciones (me gustaría lo mismo para mi tipo de publicación personalizada):
Aquí está mi código actual ( y aquí está el mismo código en 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();
}
¿Cómo puedo agregar una lista desplegable de empresas a la lista de administradores para los listados?
plugins
custom-post-types
wp-admin
Taras Mankovski
fuente
fuente
Respuestas:
ACTUALIZACIÓN: He incluido una nueva respuesta completa, pero aun así he dejado mi respuesta original en la parte inferior a la que hacen referencia los primeros comentarios.
Hola @tarasm :
Aunque dije que no debería ser difícil, es un poco complicado. Pero antes de profundizar en el código ...
Las capturas de pantalla:
... veamos algunas capturas de pantalla para el producto terminado:
Lista de la página de lista sin filtro:
(fuente: mikeschinkel.com )
Página de lista de listados con filtrado:
(fuente: mikeschinkel.com )
El código
Así que aquí vamos ... ( Nota: utilicé una forma singular para el nombre de la taxonomía de
business
; espero que coincida con el tuyo. De mucha experiencia con WordPress y desarrollo de bases de datos en el pasado, creo que es mejor hacerlo de esta manera .)Paso # 1: El
restrict_manage_posts
gancho de acción.Lo primero que debe hacer es conectar la
restrict_manage_posts
acción que no tiene parámetros y se llama desde/wp-admin/edit.php
(en v3.0.1 esa llamada está en la línea 378). Esto le permitirá generar la selección desplegable en la ubicación adecuada sobre la lista de Listado de publicaciones.Comenzamos comprobando la
$typenow
variable para asegurarnos de que estamos en unapost_type
delisting
. Si no lo hace, obtendrá este menú desplegable para todos los tipos de publicaciones, que en algunos casos es lo que desea, pero no este caso.A continuación, cargamos información sobre la taxonomía empresarial utilizando
get_taxonomy()
. Lo necesitamos para recuperar la etiqueta de la taxonomía (es decir, " Empresas "; podríamos haber codificado, pero eso no es muy bueno si necesita internacionalizar más tarde.) Luego llamamoswp_dropdown_categories()
con todos los argumentos apropiados en la$args
matriz para generar el desplegable¿Pero cuáles son los argumentos apropiados? Miremos cada uno individualmente:
show_optional_all
- Bastante sencillo, es lo que se muestra en el menú desplegable al principio y cuando no se ha aplicado ningún filtro. En nuestro caso, será "Mostrar todos los negocios ", pero podríamos haberlo llamado "Listados para todos los negocios" o lo que quiera.taxonomy
- Este argumento le dice a la función de qué taxonomía extraer los términos aunque la función tengacategories
su nombre. En v2.8 y versiones anteriores, WordPress no tenía taxonomías personalizadas, pero cuando se agregaron, el equipo decidió que sería más fácil agregar un argumento de taxonomía a esta función que crear otra función con otro nombre.name
- Este argumento le permite especificar el valor que WordPress usará para elname
atributo del elemento <select> generado para el menú desplegable. En caso de que no sea obvio, este también es el valor que se utilizará en la URL al filtrar.orderby
- Este argumento le dice a WordPress cómo ordenar los resultados alfabéticamente. En nuestro caso, especificamos ordenar comprar losname
términos de la taxonomía, es decir, los nombres comerciales en este caso.selected
- Este argumento es necesario para que el menú desplegable pueda mostrar el filtro actual en el menú desplegable. Debe ser delterm_id
término de taxonomía seleccionado. En nuestro caso, podría serterm_id
de "Business # 2" . ¿De dónde obtenemos este valor? De la variable global de WordPress$wp_query
; tiene una propiedadquery
que contiene una matriz de todos los parámetros de URL y sus valores (a menos que algún plugin rebelde ya lo haya modificado, por supuesto). Dado que WordPress procesa las cosas, se pasará unterm
parámetro de URL en la URL cuando el usuario haga clic en el filtro botón si el usuario seleccionó un término válido (es decir, una de las empresas enumeradas).hierarchical
- Al configurar esto,true
le dice a la función que respete la naturaleza jerárquica de la taxonomía y los muestre en una vista de árbol si los términos (negocios) de hecho tienen hijos. Para una captura de pantalla para ver cómo se ve esto, vea a continuación.depth
- Este argumento colabora con elhierarchical
argumento para determinar cuántos niveles de profundidad debería ir la función al mostrar elementos secundarios.show_count
- Sitrue
este argumento mostrará un recuento de publicaciones entre paréntesis a la izquierda del nombre del término dentro del menú desplegable. En este caso, mostraría un recuento de listados asociados con una empresa. Para una captura de pantalla para ver cómo se ve esto, vea a continuación.hide_empty
- Finalmente, si hay términos en la taxonomía que no están asociados con una publicación (es decir, empresas que no están asociadas con una lista), al configurar esto,true
se omitirá su inclusión en el menú desplegable.(fuente: mikeschinkel.com )
Paso # 2: El
parse_query
gancho del filtro.A continuación llamamos nuestras atenciones al enlace de
parse_query
filtro que tiene un parámetro ($query
) y se llama desde/wp-includes/query.php
(en v3.0.1 esa llamada está en la línea 1549). Se llama cuando WordPress ha terminado de inspeccionar la URL y establecer todos los valores apropiados en el activo$wp_query
incluyendo cosas como$wp_query->is_home
y$wp_query->is_author
, etc.Después de que se
parse_query
ejecute el enlace de filtro, WordPress llamaráget_posts()
y cargará una lista de publicaciones en función de lo que se especifica en el activo actual$wp_query
. Porparse_query
lo tanto, a menudo es un gran lugar para hacer que WordPress cambie de opinión sobre qué publicaciones va a cargar.En su caso de uso, queremos que WordPress filtre según las empresas seleccionadas; es decir, para mostrar solo los listados que se han asociado con el negocio seleccionado (yo diría "... solo aquellos listados que han sido " categorizados " por el negocio seleccionado" pero eso no es técnico correcto;
category
es su propia taxonomía en pares conbusiness
la excepción de quecategory
se construye en WordPress ybusiness
es personalizado. Pero para aquellos familiarizados con la categorización de mensajes que esto puede ayudar a entender a medida que trabajan de manera casi idéntica. Pero estoy divagando ...)En el código. Lo primero que hacemos es tomar una referencia a los actualmente activos
$wp_query
'squery_vars
para que sea más conveniente para trabajar, al igual que como se hace dentro de WordPress propiaparse_query()
función. A diferencia de lo$wp_query->query
que se usa para reflejar los parámetros pasados en la URL, la$wp_query->query_vars
matriz se usa para controlar la consulta que ejecuta WordPress y se espera que se modifique. Entonces, si necesita modificar uno, ese sería el indicado (al menos creo que es la diferencia entre los dos; si alguien sabe lo contrario , ¡ hágamelo saber para que pueda actualizar esto!)A continuación, probamos
$pagenow
para asegurarnos de que realmente estamos cargando WordPress desde la ruta URL/wp-admin/edit.php
. Hacemos esto para evitar arruinar accidentalmente consultas en otras páginas. También verificamos para asegurarnos de que tenemos tantobusiness
untaxonomy
elemento como unterm
elemento también. (Tenga en cuentataxonomy
yterm
son un par; se usan juntos para permitir la consulta de un término de taxonomía; debe tener ambos o WordPress no sabe qué taxonomía inspeccionar).Quizás se pregunte cómo
business
apareció eltaxonomy
elemento de laquery_vars
matriz. Lo que escribimos en nuestroparse_query
anzuelo activó la magia interna de WordPress que se puso a la espera cuando registró la "business
" taxonomía estableciéndolaquery_var
como verdadera (register_taxonomy()
copia el nombre de la taxonomía como talquery_var
; puede cambiarla, por supuesto, pero a menos que tenga un conflicto es mejor seguir con lo mismo):Ahora, $ wp_query de WordPress se escribió para usar slugs para consultas filtradas de taxonomía estándar, no ID de término de taxonomía. Para este caso de uso, lo que realmente necesitamos para que nuestra consulta de filtrado funcione son estos:
No estos:
Curiosamente y desafortunadamente, el menú desplegable generado al
wp_dropdown_categories()
establecer el atributo<option>
'svalue
para el término (/ negocio')term_id
, no el términoslug
. Por lo tanto, debemos convertir$wp_query->query_vars['term']
de unaterm_id
cadena numérica a su cadena de laslug
siguiente manera en el fragmento enganchado desde arriba (¡Tenga en cuenta que esta no es la forma más eficiente de consultar una base de datos, pero hasta que WordPress agregue soporte para term_ids en su consulta, es lo mejor que podemos hacer!) :¡Y eso es! Con esas dos funciones obtienes el filtrado que deseas.
¡PERO ESPERA HAY MAS! :-)
Seguí adelante y agregué una columna de "Negocios" a su lista de Listado porque, bueno, sabía que iba a ser su próxima pregunta. Sin tener una columna para lo que filtra, puede ser muy confuso para el usuario final. (¡Luché con eso yo mismo y fui el programador!) Por supuesto, ya puedes ver la columna "Negocios" en las capturas de pantalla anteriores.
Paso 3: el
manage_posts_columns
gancho del filtro.Para agregar una columna a la lista de publicaciones, se requieren dos (2) ganchos más. El primero es
manage_posts_columns
la versión específica del tipo de publicaciónmanage_listing_posts_columns
que llamé en su lugar. Acepta un parámetro (posts_columns
) y se llama desde/wp-admin/includes/template.php
(en v3.0.1 esa llamada está en la línea 623):Su
manage_posts_columns
función de enlace pasa una matriz de columnas donde el valor es el encabezado de columna mostrado y la clave es el identificador de columna interno. Identificadores de columna estándar pueden incluir éstos y más:'cb'
,'title
''author'
``' date'`, etc.'cb'
, es lacheckbox
columna y ambas'title'
y se'date'
refieren apost_title
ypost_date
desde lawp_posts
tabla, respectivamente.'author'
por supuesto, es elpost_author
campo después de recuperar el nombre del autor de lawp_users
tabla.(fuente: mikeschinkel.com )
Para el
manage_posts_columns
gancho, simplemente queremos insertar nuestra columnabusinesses
en la$posts_columns
matriz antes'author'
, ¡suponiendo que algún otro complemento aún no se haya eliminadoauthor
de la lista!( Tenga en cuenta que cuando escribí
add_businesses_column_to_listing_list()
se me ocurrió que PHP debe tener una forma más fácil de insertar un valor en una matriz asociativa en el orden correcto. ¿O al menos debe haber una función en el núcleo de WordPress para hacerlo? Pero desde Google me decepcionó, así que seguí con lo que funcionó. ¡Si alguien tiene alguna alternativa sugerida, estaré atento y agradecido de antemano!)Lo que finalmente nos lleva a ...
Paso # 4: el
manage_posts_custom_column
gancho de acciónLa segunda cosa de dos (2) que debemos hacer para que nuestras empresas se muestren en la columna es realmente mostrar el nombre de cada una de las empresas asociadas utilizando el
manage_posts_custom_column
gancho de acción. Este enlace acepta dos (2) parámetros (column_id
ypost_id
) y también se llama desde/wp-admin/includes/template.php
(en v3.0.1 que la llamada está en la línea 1459):Se llama a este gancho para cada columna para cada fila de publicación (/ negocio). Primero verificamos que realmente estamos trabajando solo con el
listing
tipo de publicación personalizada y luego usamos unaswitch
declaración para probar elcolumn_id
. Elegíswitch
porque este gancho a menudo se usa para generar resultados para muchas columnas diferentes, especialmente si usamos una función para muchos tipos de publicaciones diferentes que podrían verse así:Al inspeccionar nuestro caso de uso un poco más cerca, verá la
get_the_terms()
función que simplemente devuelve la lista de términos para esta taxonomía (es decir, empresas para este listado). Aquí obtenga el enlace permanente para la página web front-end del término que normalmente enumera las publicaciones asociadas con el término, pero, por supuesto, podría variar de acuerdo con el tema o los complementos instalados.Usamos el enlace permanente para hacer un hipervínculo del término solo porque me gusta hacer hipervínculos de cosas. Luego fusionamos todos los términos con hipervínculos (/ empresas) juntos separados con el carácter de canalización ('
|
') y los enviamos al búfer PHP que lo envía al navegador / cliente HTTP del usuario:AHORA finalmente hemos terminado.
Resumen
En resumen, debe usar los siguientes cuatro (4) ganchos para obtener un filtro y una columna relacionada en la página de lista de publicaciones personalizadas (Oh, también funcionará con Publicaciones y Páginas). Son:
restrict_manage_posts
gancho de acción.parse_query
gancho del filtro.manage_posts_columns
gancho del filtro.manage_posts_custom_column
gancho de acciónDónde descargar el código
Pero si te obligara a leer todo lo anterior, ¡ciertamente no sería una buena persona si también te obligara a desenterrar el código solo para poder probarlo! Pero al contrario de lo que dicen algunas personas, soy amable. Así que aquí tienes:
NOTA para @tarasm : incluí ganchos para a
register_post_type()
yregister_taxonomy()
para que otros pudieran probar esto sin tener que recrearlos. Probablemente desee eliminar esas dos llamadas de función antes de probar esto.EL FIN
Respuesta original
Hola @tarasm :
¿Está buscando un menú desplegable en la parte superior como esta pantalla o está buscando un menú desplegable por registro de publicación y, de ser así, cómo esperaría que este último funcione?
(fuente: mikeschinkel.com )
Si es lo primero, eche un vistazo a esta respuesta a la pregunta ¿Cómo ordenar el área de administración de un tipo de publicación personalizada de Wordpress por un campo personalizado? Si eso es lo que necesita, puedo proporcionarle más detalles relacionados con la taxonomía.
fuente
Solo quería compartir una implementación alternativa. No tenía el increíble tutorial de Mike cuando estaba resolviendo esto, así que mi solución es un poco diferente. Específicamente, voy a simplificar el paso 1 de Mike y eliminar el paso 2 ; los otros pasos siguen siendo aplicables.
En el tutorial de Mike, el uso
wp_dropdown_categories()
nos ahorra algo de creación manual de listas, pero requiere una modificación de consulta condicional complicada ( paso # 2 ) para manejar su uso de ID en lugar de slug. Sin mencionar la dificultad de modificar ese código para lidiar con otros escenarios, como múltiples filtros de taxonomía.Otro enfoque es simplemente no utilizar los defectos
wp_dropdown_categories()
, sino crear nuestras propias listas de selección desplegables desde cero. No es tan complicado, toma menos de 30 líneas de código y no requiere engancheparse_query
en absoluto:Simplemente conectando las taxonomías deseadas en la
$filters
matriz, puede generar rápidamente múltiples filtros de taxonomía. Parecen exactamente iguales a los de las capturas de pantalla de Mike. Luego puede continuar con los pasos 3 y 4 .fuente
wp_dropdown_categories()
requiere muchas soluciones alternativas. Intento seguir con las funciones principales cuando es posible, pero como señalas a veces se necesita más trabajo de esa manera. Simplemente demuestra que con WordPress a menudo hay más de una buena forma de resolver un problema. ¡Buen trabajo!Aquí hay una versión de esto que crea y aplica automáticamente filtros de todas las taxonomías que se aplican a todos los tipos de publicaciones personalizadas que los usan. (qué bocado) De todos modos, también lo modifiqué para que funcione con wp_dropdown_categories () y wordpress 3.1. El proyecto en el que estoy trabajando se llama ToDo, puede cambiar el nombre de las funciones a algo que tenga sentido para usted, pero esto debería funcionar para todo automáticamente.
Tenga en cuenta que estoy usando un complemento que agrega 'term_order' como una forma de ordenar los términos, tendrá que cambiar eso o eliminar ese argumento para volver al valor predeterminado.
fuente
Respuesta tardía
Editar
He escrito Filterama , un complemento que agregará esta funcionalidad de la manera más fácil posible.
Actualización para WordPress 3.5+
Ahora que las cosas son mucho más fáciles, aquí hay una solución muy simple como plugin o mu-plugin.
Utiliza la menor cantidad de recursos posible, se carga solo en las pantallas necesarias y agrega columnas + filtros para cada taxonomía personalizada.
Y luego solo necesitas una clase Walker personalizada.
fuente
$this->setup_vars();
al principio depublic function setup()
para tener"manage_taxonomies_for_{$this->post_type}_columns"
trabajoadd_action( 'init', array( 'WCM_Admin_PT_List_Tax_Filter', 'init' ) );
Solo quería hacer una nota rápida. En las versiones más recientes de WP, la clase WP_Posts_List_Table maneja los listados de publicaciones en admin. El código apply_filters ahora es el siguiente:
Entonces, para agregar nuevas columnas, un gancho add_filter debería ser así:
Aquí va un ejemplo:
Ahora, para las filas de publicaciones. Este es el código que maneja los datos de columna en los listados:
Para recuperar nuestros datos de publicaciones, debemos agregar un gancho de acción como este:
Ejemplo (este ejemplo usa taxonomías, pero puede consultar cualquier otra cosa):
fuente
¡FUNCIONA EN WP 3.2!
custom_post_type: books custom_taxonomy: género
Solo modifique donde dice: // cambie AQUÍ
fuente
__("Show All {$info_taxonomy->label}")
es una forma incorrecta de usar cadenas traducibles.Aquí hay una manera de hacerlo usando la acción restrict_manage_posts. Parece que funciona bien para mí y agrega la capacidad de filtrar por taxonomía para todos los tipos de publicaciones y taxonomías relacionadas.
Una nota: intenté restringir la profundidad porque algunas de mis taxonomías jerárquicas son bastante grandes, pero no funcionó, ¿podría ser un error en la función wp_dropdown_categories?
fuente
Supongo que esto no se sabe bien, pero a partir de wordpress 3.5, puede pasar
'show_admin_column' => true
aregister_taxonomy
. Esto hace 2 cosas:Entonces, no es exactamente lo mismo que tener una selección, pero casi la misma funcionalidad, ancho solo una fila de código.
https://make.wordpress.org/core/2012/12/11/wordpress-3-5-admin-columns-for-custom-taxonomies/
Además, como puede leer, hay un nuevo filtro diseñado para agregar manualmente la columna de taxonomía (si realmente lo necesita).
fuente
Versión jerárquica de la respuesta de @ somatic, según lo solicitado por @kevin:
Básicamente eliminé el código que creó las opciones y lo puse en su propia función. La función 'generate_taxonomy_options', además de tomar tax_slug, también toma un parámetro primario y de nivel. La función supone que está creando opciones para el padre 0, que seleccionará todos los términos del nivel raíz. En el bucle, la función se llamará recursivamente a sí misma, utilizando ese término actual como padre y aumentando el nivel en uno. ¡Agrega garrapatas automáticamente a un lado cuanto más profundo bajes del árbol y listo!
fuente
Actualización de la respuesta de @Drew Gourley para WP 3.3.1 (e incorporando código de http://wordpress.org/support/topic/wp_dropdown_categories-generating-url-id-number-instead-of-slug?replies=6#post- 2529115 ):
fuente
Disculpas por el hecho de que, como nuevo usuario, no puedo publicar comentarios pero puedo publicar una respuesta ...
A partir de WordPress 3.1 (RC 1) la respuesta de Mike (que me ha servido tan bien durante los últimos meses) ya no me funciona; restringir por cualquier taxonomía hijo da un resultado vacío. Probé la actualización de Somatic y funcionó muy bien; aún mejor, funciona con múltiples consultas de taxonomía que se han trabajado en esta versión.
fuente
Acabo de probar ambos códigos, de Mike y somatic, y me preguntaba cómo obtener una cosa de cada técnica:
Con el código de Mike, muestra la lista desplegable con la opción jerárquica , lo que ayuda mucho. Pero para mostrar dos menús desplegables tuve que duplicar la
if ($typenow=='produtos') {...}
declaración en la funciónrestrict_listings_by_business()
y tambiénif ($pagenow=='edit.php' && ... }
en laconvert_business_id_to_taxonomy_term_in_query($query)
función que ahora da mucho código.Con el código somático solo necesito especificar las taxonomías que me gustaría ver como desplegables y bam, funciona;
$filters = array('taxo1', 'taxo2');
Pregunta: ¿puedo obtener el enfoque somático y también tener la opción jerárquica ?
Muchas gracias de todos modos por este tutorial, ¡me ayudó mucho!
fuente
¡El tutorial de Mike sobre esto es genial! Probablemente no me habría molestado en agregar esta funcionalidad a mi complemento de Categorías de medios si hubiera tenido que resolverlo por mi cuenta.
Dicho esto, creo que usar
parse_query
y luego obtener la consulta del término no es necesario. Es más limpio para crear tu propia clase de andador personalizado. Tal vez eso no fue posible cuando escribió su publicación: tenía 3 años cuando escribí esto.Echa un vistazo a este gran fragmento en github. Funciona de maravilla, cambia los ID de los valores desplegables en babosas, por lo que funciona de forma nativa sin modificar la consulta.
https://gist.github.com/stephenh1988/2902509
fuente