Filtrar por campo personalizado no tipo de postagem personalizada na página de administrador


11

Eu usei Advanced Custom Fields para criar campos personalizados para o nome da competição, respostas etc. Eu criei um tipo de postagem personalizado para competições, como mostrado na imagem, e usei o Wordpress functions.php para criar as colunas a partir dos valores dos campos personalizados.

Estou tentando obter uma caixa suspensa "Filtrar por" com os nomes / rótulos diferentes das competições, como mostrado abaixo, mas só consigo encontrar soluções usando taxonomias, que prefiro não usar se possível, porque usei apenas campos personalizados para todo o resto.

É possível criar um menu suspenso "Filtrar por" personalizado usando apenas campos personalizados?

Wordpress filtrar por


Você pode usar o restrict_manage_postsgancho de ação para adicionar caixas suspensas adicionais. Porém, não esqueça que você também precisará adicionar alguma lógica ao filtro, pois o WP não saberá o que fazer com ele imediatamente (ao contrário das listas suspensas de taxonomia, com as quais ele pode lidar automaticamente).
David Gard

Como pensamento adicional - se desejar, você pode inserir o Nome no link da sua Tabela de listas, o que significa que você pode filtrar uma Competição clicando no nome, em vez de ter uma lista suspensa.
David Gard

Respostas:


12

E para exibir o resultado para o Filtro, tente este código

add_filter( 'parse_query', 'prefix_parse_filter' );
function  prefix_parse_filter($query) {
   global $pagenow;
   $current_page = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';

   if ( is_admin() && 
     'competition' == $current_page &&
     'edit.php' == $pagenow && 
      isset( $_GET['competition-name'] ) && 
      $_GET['competition-name'] != '') {

    $competion_name = $_GET['competition-name'];
    $query->query_vars['meta_key'] = 'competition_name';
    $query->query_vars['meta_value'] = $competition_name;
    $query->query_vars['meta_compare'] = '=';
  }
}

Altere a meta chave e o valor meta, conforme necessário. Peguei "nome da competição como meta_key e" nome da competição "como nome suspenso selecionado.


Bom, eu estava me sentindo preguiçoso, então sugeri que ele fizesse uma pergunta adicional;) ​​#
482 David Gard David

Parece que as 2 respostas são uma resposta completa e devem ser combinadas.
RCNeil

10

A ação restring_manage_posts aciona a add_extra_tablenav()função, que é como você adiciona menus suspensos adicionais à sua tabela de lista desejada.

No exemplo abaixo, primeiro asseguramos que o Tipo de postagem esteja correto e, em seguida, capturamos todos os valores de banco de dados armazenados em relação à competition_namechave na postmetatabela (você deve alterar o nome da chave conforme necessário). A consulta é bastante básica e apenas verifica se o Concurso é publicado, pega apenas valores únicos (você não deseja duplicação no menu suspenso) e os ordena em ordem alfabética.

Em seguida, verificamos os resultados (não adianta produzir o menu suspenso à toa) e depois construímos as opções (incluindo um padrão para mostrar tudo). Finalmente, o menu suspenso é produzido.

Como afirmado no meu comentário, esse não é o fim da história; você precisará de alguma lógica para informar a Tabela de Lista para mostrar apenas os resultados desejados quando o filtro estiver ativo, mas deixarei você dar uma olhada nisso e iniciar outra pergunta se precisar de mais assistência. Dica - confira o arquivo /wp-admin/includes/class-wp-posts-list-table.phpe ele é pai.../wp-class-list-table.php

/**
 * Add extra dropdowns to the List Tables
 *
 * @param required string $post_type    The Post Type that is being displayed
 */
add_action('restrict_manage_posts', 'add_extra_tablenav');
function add_extra_tablenav($post_type){

    global $wpdb;

    /** Ensure this is the correct Post Type*/
    if($post_type !== 'competition')
        return;

    /** Grab the results from the DB */
    $query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type
    );
    $results = $wpdb->get_col($query);

    /** Ensure there are options to show */
    if(empty($results))
        return;

    // get selected option if there is one selected
    if (isset( $_GET['competition-name'] ) && $_GET['competition-name'] != '') {
        $selectedName = $_GET['competition-name'];
    } else {
        $selectedName = -1;
    }

    /** Grab all of the options that should be shown */
    $options[] = sprintf('<option value="-1">%1$s</option>', __('All Competitions', 'your-text-domain'));
    foreach($results as $result) :
        if ($result == $selectedName) {
            $options[] = sprintf('<option value="%1$s" selected>%2$s</option>', esc_attr($result), $result);
        } else {
            $options[] = sprintf('<option value="%1$s">%2$s</option>', esc_attr($result), $result);
        }
    endforeach;

    /** Output the dropdown menu */
    echo '<select class="" id="competition-name" name="competition-name">';
    echo join("\n", $options);
    echo '</select>';

}

Ao usar isso, eu recebo o erroNotice: wpdb::prepare was called incorrectly. The query does not contain the correct number of placeholders (6) for the number of arguments passed (5). Please see Debugging in WordPress for more information. (This message was added in version 4.8.3.) in /[...]/wp-includes/functions.php on line 4773
rassoh

Também estou recebendo o mesmo erro
Vasim Shaikh 30/01

0

Se isso não funcionar para ninguém, minha solução precisaria adicionar a Coluna que eu estava tentando filtrar à lista de colunas Classificáveis ​​para o meu tipo de postagem personalizado.

// Make Custom Post Type Custom Columns Sortable
function cpt_custom_columns_sortable( $columns ) {

    // Add our columns to $columns array
    $columns['item_number'] = 'item_number';
    $columns['coat_school'] = 'coat_school'; 

    return $columns;
} add_filter( 'manage_edit-your-custom-post-type-slug_sortable_columns', 'cpt_custom_columns_sortable' );

0

Substitua a consulta abaixo para corrigir o erro wpdb: prepare:

$query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type,
        'competition_name' //this is needed a second time to define "%3$s" in ORDER BY
  );
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.