Criei um tipo de postagem personalizado chamado 'listing'
e adicionei uma taxonomia personalizada chamada 'businesses'
. Gostaria de adicionar uma lista suspensa de empresas à lista de administradores das listagens.
Aqui está a aparência dessa funcionalidade na lista de administradores das Postagens (eu gostaria do mesmo para o meu Tipo de postagem personalizada):
Aqui está o meu código atual ( e aqui está o mesmo código no 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();
}
Como posso adicionar uma lista suspensa de empresas à lista de administradores das listagens?
plugins
custom-post-types
wp-admin
Taras Mankovski
fonte
fonte
Respostas:
ATUALIZAÇÃO: incluí uma nova resposta completa, mas mesmo assim deixei minha resposta original na parte inferior, à qual os primeiros comentários se referem.
Olá @tarasm :
Embora eu tenha dito que não deveria ser difícil, está um pouco envolvido. Mas antes de cavarmos o código ...
As capturas de tela:
... vamos ver algumas capturas de tela do produto acabado:
Página da lista de listagens sem filtragem:
(fonte: mikeschinkel.com )
Página de listagem de listagens Com filtragem:
(fonte: mikeschinkel.com )
O código
Então, aqui vamos nós ... ( Nota: usei uma forma singular para o nome da taxonomia de
business
; espero que corresponda ao seu. Com muita experiência com o WordPress e o desenvolvimento de bancos de dados no passado, acredito que seja melhor fazê-lo dessa maneira .)Etapa 1: o
restrict_manage_posts
gancho de ação.A primeira coisa que você precisa fazer é conectar a
restrict_manage_posts
ação que não possui parâmetros e é chamada a partir/wp-admin/edit.php
(na v3.0.1, a chamada está na linha 378.) Isso permitirá gerar a seleção suspensa no local apropriado acima da lista de Listando postagens.Começamos verificando a
$typenow
variável para garantir que estamos de fato em umpost_type
delisting
. Caso contrário, você receberá essa lista suspensa para todos os tipos de postagem que, em alguns casos, é o que você deseja, mas não neste caso.Em seguida, carregamos informações sobre a taxonomia comercial usando
get_taxonomy()
. Precisamos recuperar o rótulo da taxonomia (ou seja, " Negócios "; poderíamos ter codificado, mas isso não é muito bom se você precisar internacionalizar mais tarde.) Em seguida, chamamoswp_dropdown_categories()
todos os argumentos apropriados na$args
matriz para gerar o suspensoMas quais são os argumentos apropriados? Vamos olhar para cada um individualmente:
show_optional_all
- Bem direto, é o que é exibido no menu suspenso primeiro e quando não há filtragem aplicada. No nosso caso, será "Mostrar todas as empresas ", mas poderíamos chamá-lo de "Listagens para todas as empresas" ou o que você quiser.taxonomy
- Esses argumentos informam à função de que taxonomia extrair termos, mesmo que a função tenhacategories
em seu nome. Na v2.8 e anterior, o WordPress não tinha taxonomias personalizadas, mas quando elas foram adicionadas, a equipe decidiu que seria mais fácil adicionar um argumento de taxonomia a essa função do que criar outra função com outro nome.name
- Este argumento permite especificar o valor que o WordPress usa para oname
atributo do elemento <select> gerado para o menu suspenso. Caso não seja óbvio, esse também é o valor que será usado na URL ao filtrar.orderby
- Este argumento diz ao WordPress como ordenar os resultados em ordem alfabética. No nosso caso, especificamos para comprar osname
termos da taxonomia, ou seja, os nomes das empresas nesse caso.selected
- Este argumento é necessário para que o menu suspenso possa mostrar o filtro atual no menu suspenso. Deve ser doterm_id
termo de taxonomia selecionado. No nosso caso, pode serterm_id
do "Business # 2" . Onde conseguimos esse valor? Da variável global do WordPress$wp_query
; ele possui uma propriedadequery
que contém uma matriz de todos os parâmetros da URL e seus valores (a menos que algum plugin rebelde o tenha modificado, é claro.) Dado como o WordPress processa as coisas, haverá umterm
parâmetro da URL passado na URL quando o usuário clicar no filtro botão se o usuário selecionou um termo válido (ou seja, uma das empresas listadas).hierarchical
- Ao definir isso paratrue
você informar à função que respeite a natureza hierárquica da taxonomia e exibi-los em uma exibição em árvore, se os termos (negócios) tiverem filhos. Para uma captura de tela para ver como é isso, veja abaixo.depth
- Esse argumento colabora com ohierarchical
argumento para determinar quantos níveis de profundidade a função deve exibir na exibição de filhos.show_count
- Setrue
esse argumento exibir uma contagem de postagens entre parênteses à esquerda do nome do termo na lista suspensa. Nesse caso, seria exibida uma contagem de listagens associadas a uma empresa. Para uma captura de tela para ver como é isso, veja abaixo.hide_empty
- Por fim, se houver termos na taxonomia que não estejam associados a uma postagem (ou seja, empresas não associadas a uma listagem), definir isso paratrue
omitir a inclusão na lista suspensa.(fonte: mikeschinkel.com )
Etapa 2: o
parse_query
gancho do filtro.Em seguida, chamamos nossa atenção para o
parse_query
gancho de filtro que possui um parâmetro ($query
) e é chamado/wp-includes/query.php
(na v3.0.1, essa chamada está na linha 1549). É chamado quando o WordPress termina de inspecionar a URL e definir todos os valores apropriados no momento. ativo,$wp_query
incluindo coisas como$wp_query->is_home
e$wp_query->is_author
etc.Depois que o
parse_query
gancho do filtro for executado, o WordPress chamaráget_posts()
e carregará uma lista de postagens com base no que está especificado no ativo atualmente$wp_query
. Por isso,parse_query
muitas vezes é um ótimo lugar para fazer o WordPress mudar de idéia sobre quais postagens serão carregadas.No seu caso de uso, queremos que o WordPress filtre com base nas empresas selecionadas; ou seja, para exibir apenas as listagens que foram associadas à empresa selecionada (eu diria "... somente as listagens que foram " categorizadas " pela empresa selecionada", mas isso não é técnico correto);
category
é a própria taxonomia entre pares com abusiness
exceção de quecategory
está embutido no WordPress ebusiness
é personalizado. Mas, para aqueles familiarizados com a categorização de postagens, isso pode ajudá-lo a entender, pois eles funcionam quase de forma idêntica. Mas discordo ...)Para o código. A primeira coisa que fazemos é pegar uma referência aos ativos atualmente
$wp_query
,query_vars
para que seja mais conveniente trabalhar, assim como é feito naparse_query()
função do WordPress . Diferente do$wp_query->query
que é usado para espelhar os parâmetros passados no URL, a$wp_query->query_vars
matriz é usada para controlar a consulta que o WordPress executa e espera-se que seja modificada. Portanto, se você precisar modificar um, seria esse (pelo menos eu acho que é o diferente entre os dois; se alguém souber de outra forma, por favor me avise para que eu possa atualizar isso!)Em seguida, testamos
$pagenow
para garantir que estamos realmente carregando o WordPress a partir do caminho da URL/wp-admin/edit.php
. Fazemos isso para não estragar as consultas acidentalmente em outras páginas. Também verificamos se temos tantobusiness
umtaxonomy
elemento quanto umterm
elemento. (Observetaxonomy
eterm
são um par; eles são usados juntos para permitir a consulta de um termo de taxonomia; é preciso ter os dois ou o WordPress não sabe qual taxonomia inspecionar.)Você pode se perguntar como
business
apareceu notaxonomy
elemento daquery_vars
matriz. O que escrevemos em nossoparse_query
livro desencadeou a magia interna do WordPress que estava em espera quando você registrou abusiness
taxonomia " " definindo-query_var
a como verdadeira (register_taxonomy()
copia o nome da taxonomia como suaquery_var
; você pode alterá-la, é claro, mas a menos que tenha um conflito é melhor ficar com o mesmo):Agora, o $ wp_query do WordPress foi escrito para usar slugs em consultas filtradas por taxonomia padrão, e não em IDs de termos de taxonomia. Para este caso de uso, o que realmente precisamos para que nossa consulta de filtragem funcione são:
Não estes:
Curiosamente e infelizmente, o menu suspenso gerado por
wp_dropdown_categories()
define o atributo<option>
'svalue
para o termo (/ comercial')term_id
, não para o termoslug
. Portanto, precisamos converter$wp_query->query_vars['term']
de um numéricoterm_id
para sua sequência daslug
seguinte forma no snippet capturado acima (Observe que essa não é a maneira mais eficiente de consultar um banco de dados, mas até que o WordPress adicione suporte a term_ids em sua consulta, é o melhor que podemos fazer!) :E é isso! Com essas duas funções, você obtém a filtragem que deseja.
MAS ESPERE, HÁ MAIS! :-)
Fui em frente e adicionei uma coluna "Empresas" à sua lista de listagens porque, bem, eu sabia que essa seria sua próxima pergunta. Sem ter uma coluna para o que você filtra, pode ser muito confuso para o usuário final. (Eu mesmo lutei com ele e fui o codificador!) É claro que você já pode ver a coluna "Negócios" nas capturas de tela anteriores acima.
Etapa 3: o
manage_posts_columns
gancho do filtro.Para adicionar uma coluna à lista de postagens, é necessário chamar mais dois (2) ganchos. O primeiro é
manage_posts_columns
ou a versão específica do tipo de postagemmanage_listing_posts_columns
que chamei. Ele aceita um parâmetro (posts_columns
) e é chamado de/wp-admin/includes/template.php
(na v3.0.1, essa chamada está na linha 623):Sua
manage_posts_columns
função de gancho recebe uma matriz de colunas em que o valor é o cabeçalho da coluna exibido e a chave é o identificador interno da coluna. Identificadores de coluna padrão pode incluir estes e mais:'cb'
,'title
''author'
, ``' date'`, etc.'cb'
, é acheckbox
coluna e ambos'title'
e se'date'
referem apost_title
epost_date
dawp_posts
tabela, respectivamente.'author'
é claro que é opost_author
campo após o nome do autor ser recuperado dawp_users
tabela.(fonte: mikeschinkel.com )
Para o
manage_posts_columns
gancho, estamos simplesmente querendo inserir nossa colunabusinesses
na$posts_columns
matriz antes'author'
, assumindo que algum outro plugin ainda não tenha sido removidoauthor
da lista!( Observe que, como escrevi
add_businesses_column_to_listing_list()
, me ocorreu que o PHP deve ter uma maneira mais fácil de inserir um valor em uma matriz associativa na ordem correta?!? Ou pelo menos deve haver uma função no núcleo do WordPress para fazer isso? Mas como o Google decepcione-me, então fui com o que funcionou. Se alguém tiver alguma alternativa sugerida, serei todo ouvidos e agradecemos antecipadamente!)O que finalmente nos leva a ...
Etapa 4: o
manage_posts_custom_column
gancho de açãoA segunda coisa de dois (2) que precisamos fazer para que nossos negócios sejam exibidos na coluna é realmente gerar o nome de cada um dos negócios associados usando o
manage_posts_custom_column
gancho de ação. Esse gancho aceita dois (2) parâmetros (column_id
epost_id
) e também é chamado de/wp-admin/includes/template.php
(na v3.0.1, a chamada está na linha 1459.):Esse gancho é chamado para cada coluna para cada linha de postagem (/ comercial). Primeiro, verificamos que estamos realmente trabalhando apenas com o
listing
tipo de postagem personalizada e, em seguida, usamos umaswitch
instrução para testar ocolumn_id
. Eu escolhiswitch
porque esse gancho é frequentemente usado para gerar saída para muitas colunas diferentes, especialmente se usarmos uma função para muitos tipos diferentes de postagem, que podem ser algo como isto:Inspecionando nosso caso de uso um pouco mais perto, você vê a
get_the_terms()
função que simplesmente retorna a lista de termos para esta taxonomia (ou seja, empresas para esta listagem). Veja aqui o link permanente para a página da web de front-end do termo que normalmente lista as postagens associadas com o termo, mas é claro que isso pode ser diferente, dependendo do tema e / ou plug-ins instalados.Usamos o link permanente para vincular o termo apenas porque gosto de vincular coisas. Em seguida, mesclamos todos os termos com hiperlink (/ business) juntos, separados pelo caractere pipe ('
|
') e emitimos para o buffer PHP que o envia ao navegador / cliente HTTP do usuário:Agora estamos finalmente prontos.
Sumário
Portanto, em resumo, você precisa usar os quatro (4) ganchos a seguir para obter um filtro e uma coluna relacionada na página de lista de postagens personalizada (Ah, ele também funcionará com Postagens e Páginas.) São elas:
restrict_manage_posts
gancho de ação.parse_query
gancho do filtro.manage_posts_columns
gancho do filtro.manage_posts_custom_column
gancho de açãoOnde baixar o código
Mas se eu forçar você a ler todas as opções acima, certamente não seria uma pessoa muito legal se eu também fizesse você desenterrar o código apenas para poder testá-lo! Mas, ao contrário do que algumas pessoas dizem, eu sou legal. Então aqui vai você:
NOTA para @tarasm : incluí ganchos para
register_post_type()
eregister_taxonomy()
para que outros pudessem experimentar isso sem ter que recriá-los. Você provavelmente desejará excluir essas duas chamadas de função antes de testar isso.O FIM
Resposta original:
Olá @tarasm :
Você está procurando uma lista suspensa na parte superior como esta tela ou está procurando uma lista suspensa por registro de postagem e, em caso afirmativo, como espera que o último funcione?
(fonte: mikeschinkel.com )
Se o primeiro, dê uma olhada nesta resposta à pergunta Como classificar a área administrativa de um tipo de postagem personalizada do Wordpress por um campo personalizado? Se é isso que você precisa, posso fornecer mais detalhes relacionados à taxonomia.
fonte
Só queria compartilhar uma implementação alternativa. Eu não tinha o tutorial incrível de Mike quando estava pensando nisso, então minha solução é um pouco diferente. Especificamente, vou simplificar a etapa 1 de Mike e eliminar a etapa 2 - as outras etapas ainda são aplicáveis.
No tutorial de Mike, o uso
wp_dropdown_categories()
economiza um pouco de criação manual de listas, mas requer algumas modificações complicadas de consulta condicional ( etapa 2 ) para lidar com o uso de ID em vez de slug. Sem mencionar a dificuldade de modificar esse código para lidar com outros cenários, como vários filtros de taxonomia.Outra abordagem é simplesmente não usar as falhas
wp_dropdown_categories()
, mas criar nossas próprias listas suspensas do zero. Não é tão complicado, requer menos de 30 linhas de código e não requer conexãoparse_query
:Simplesmente conectando as taxonomias desejadas à
$filters
matriz, você pode gerar rapidamente vários filtros de taxonomia. Eles parecem exatamente os mesmos das capturas de tela de Mike. Depois, você pode seguir com as etapas 3 e 4 .fonte
wp_dropdown_categories()
requer várias soluções alternativas. Tento manter as funções principais sempre que possível, mas, como você aponta, às vezes é preciso mais trabalho dessa maneira. Isso só prova que, com o WordPress, muitas vezes há mais de uma boa maneira de resolver um problema. Bom trabalho!Aqui está uma versão disso que cria e aplica automaticamente filtros de todas as taxonomias que se aplicam a todos os tipos de postagem personalizados que os utilizam. (que boca cheia) De qualquer forma, eu também o aprimorei para que funcione com wp_dropdown_categories () e wordpress 3.1. O projeto em que estou trabalhando se chama ToDo. Você pode renomear as funções para algo que faça sentido para você, mas isso deve funcionar para tudo automaticamente.
Observe que estou usando um plug-in que adiciona 'term_order' como uma maneira de solicitar termos, você precisará alterar isso ou remover esse argumento para retornar ao padrão.
fonte
Resposta atrasada
Editar
Eu escrevi o Filterama , um plugin que adicionará essa funcionalidade da maneira mais fácil possível.
Atualização para WordPress 3.5+
Agora que as coisas estão muito mais fáceis, aqui está uma solução muito simples como plugin ou mu-plugin.
Utiliza o menor número possível de recursos, carrega apenas nas telas necessárias e adiciona Colunas + Filtros para cada taxonomia personalizada.
E então você só precisa de uma classe Walker personalizada.
fonte
$this->setup_vars();
no iníciopublic function setup()
, a fim de ter"manage_taxonomies_for_{$this->post_type}_columns"
trabalhoadd_action( 'init', array( 'WCM_Admin_PT_List_Tax_Filter', 'init' ) );
Eu só queria fazer uma anotação rápida. Nas versões mais recentes do WP, as listagens de postagem no admin são tratadas pela classe WP_Posts_List_Table. O código apply_filters agora é o seguinte:
Portanto, para adicionar novas colunas, um gancho add_filter deve ser assim:
Aqui está um exemplo:
Agora, para as linhas da postagem. Este é o código que manipula dados da coluna nas listagens:
Para recuperar os dados de nossas postagens, precisamos adicionar um gancho de ação como este:
Exemplo (este exemplo usa taxonomias, mas você pode consultar outras coisas):
fonte
OBRAS NO WP 3.2!
custom_post_type: livros custom_taxonomy: gênero
Apenas modifique onde diz: // alterar AQUI
fonte
__("Show All {$info_taxonomy->label}")
é uma maneira errada de usar seqüências de caracteres traduzíveis.Aqui está uma maneira de fazer isso usando a ação strict_manage_posts. Parece funcionar bem para mim e adiciona a capacidade de filtrar por taxonomia para todos os tipos de post e taxonomias relacionadas.
Uma observação - tentei restringir a profundidade porque algumas de minhas taxonomias hierárquicas são bastante grandes, mas não funcionaram - poderia ser um bug na função wp_dropdown_categories?
fonte
Isso não é bem conhecido, eu acho, mas a partir do wordpress 3.5, você pode passar
'show_admin_column' => true
pararegister_taxonomy
. Isso faz duas coisas:Portanto, não é exatamente o mesmo que ter um select, mas quase a mesma funcionalidade, largura apenas uma linha de código.
https://make.wordpress.org/core/2012/12/11/wordpress-3-5-admin-columns-for-custom-taxonomies/
Além disso, como você pode ler, há um novo filtro personalizado para adicionar manualmente a coluna de taxonomia (se você realmente precisar).
fonte
Versão hierárquica da resposta da @ somatic, conforme solicitado por @kevin:
Eu basicamente removi o código que criou as opções e coloquei isso em sua própria função. A função 'generate_taxonomy_options', além de usar o tax_slug, também aceita um parâmetro pai e nível. A função assume que está criando opções para o pai 0, que selecionará todos os termos do nível raiz. No loop, a função se chamará recursivamente, usando esse termo atual como pai e aumentando o nível em um. Ele adiciona automaticamente carrapatos ao lado, quanto mais fundo você desce da árvore e pronto!
fonte
Atualização da resposta de @Drew Gourley para o WP 3.3.1 (e incorporando o código em http://wordpress.org/support/topic/wp_dropdown_categories-generating-url-id-number-instead-of-slug?replies=6#post- 2529115 ):
fonte
Desculpas pelo fato de que, como novo usuário, não posso postar comentários, mas posso postar uma resposta ...
A partir do WordPress 3.1 (RC 1), a resposta de Mike (que me serviu muito bem nos últimos dois meses) não funciona mais para mim; restringir por qualquer filho de taxonomia fornece um resultado vazio. Eu tentei a atualização do Somatic e funcionou muito bem; melhor ainda, ele trabalha com várias consultas de taxonomia que foram trabalhadas nesta versão.
fonte
Apenas tentei os dois códigos, de Mike e somático, e estava pensando em como obter uma coisa de cada técnica:
Com o código de Mike, ele mostra a lista suspensa com a opção hierárquica , o que ajuda muito. Mas, para exibir duas listas suspensas, eu tive que duplicar a
if ($typenow=='produtos') {...}
instrução na funçãorestrict_listings_by_business()
e tambémif ($pagenow=='edit.php' && ... }
naconvert_business_id_to_taxonomy_term_in_query($query)
função, que agora fornece muito código.Com o código da sommatic, só preciso especificar as taxonomias que gostaria de ver como dropdowns e bam, funciona;
$filters = array('taxo1', 'taxo2');
Pergunta: posso obter a abordagem da somática e também ter a opção hierárquica ?
De qualquer forma, muito obrigado por este tutorial, ajudou muito!
fonte
O tutorial de Mike é ótimo! Provavelmente, eu não teria me incomodado em adicionar essa funcionalidade ao meu plug-in Categorias de Mídia se eu tivesse que descobrir isso sozinho.
Dito isto, acho que usar
parse_query
e, em seguida, obter consulta para o termo não é necessário. É mais limpo para criar sua própria classe de caminhante personalizado. Talvez isso não fosse possível quando ele escreveu seu post - ele tinha 3 anos na época em que escrevi isso.Confira este ótimo snippet no github. Funciona como um encanto, altera os IDs nos valores suspensos em slugs, portanto, funciona de forma nativa sem modificar a consulta.
https://gist.github.com/stephenh1988/2902509
fonte