Filtrar por campo personalizado en el tipo de publicación personalizada en la página de administración


11

Utilicé los campos personalizados avanzados para crear campos personalizados para el nombre de la competencia, las respuestas, etc. Hice un tipo de publicación personalizada para las competiciones como se muestra en la imagen y utilicé Wordpress functions.php para crear las columnas a partir de los valores de mis campos personalizados.

Estoy tratando de obtener un cuadro desplegable "Filtrar por" con los diferentes nombres / etiquetas de la competencia como se muestra a continuación, pero solo puedo encontrar soluciones usando taxonomías, que prefiero no usar si es posible porque solo he usado campos personalizados para todo lo demas.

¿Es posible hacer un menú desplegable personalizado "Filtrar por" usando solo campos personalizados?

Wordpress filtra por


Puede utilizar el restrict_manage_postsgancho de acción para agregar cuadros desplegables adicionales. Sin embargo, no olvide que también tendría que agregar algo de lógica para el filtro, ya que WP no sabrá qué hacer con él fuera de la caja (a diferencia de las listas desplegables de taxonomía, que puede manejar automáticamente).
David Gard

Como pensamiento adicional, si lo desea, puede hacer que el Nombre se vincule dentro de su Tabla de listas, lo que significa que puede filtrar una Competencia haciendo clic en el nombre, en lugar de tener un menú desplegable.
David Gard

Respuestas:


12

Y para mostrar el resultado del filtro, pruebe 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'] = '=';
  }
}

Cambie la metaclave y el metavalor según sea necesario. Tomé "nombre de competencia como meta_key y" nombre de competencia "como nombre desplegable de selección.


Agradable, me sentía flojo, así que le sugerí que hiciera una pregunta adicional;)
David Gard

Parece que las 2 respuestas son una respuesta completa y deben combinarse.
RCNeil

10

La acción restrict_manage_posts activa la add_extra_tablenav()función, que es cómo agrega menús desplegables adicionales a la tabla de lista deseada.

En el siguiente ejemplo, primero nos aseguramos de que el Tipo de publicación sea ​​correcto, y luego tomamos todos los valores de DB almacenados contra la competition_nameclave en la postmetatabla (debe cambiar el nombre de la clave según sea necesario). La consulta es bastante básica y solo verifica si la Competencia está publicada, solo toma valores únicos (no desea duplicación en el menú desplegable) y luego los ordena alfabéticamente.

A continuación, verificamos los resultados (no hay ningún punto que muestre el menú desplegable para nada), y luego construimos las opciones (incluido un defualt para mostrar todo). Finalmente, se muestra el menú desplegable.

Como se indicó en mi comentario, este no es el final de la historia; necesitará algo de lógica para decirle a la Tabla de lista que solo muestre los resultados deseados cuando el filtro esté activo, pero lo dejaré que lo vea y luego comience otra pregunta si necesita más ayuda. Sugerencia : revise el archivo /wp-admin/includes/class-wp-posts-list-table.php, y es padre.../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>';

}

Al usar esto, obtengo el errorNotice: 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

También recibo el mismo error
Vasim Shaikh

0

Si esto no funciona para nadie, mi solución necesitaba agregar la columna por la que intentaba filtrar a la lista de columnas ordenables para mi tipo de publicación personalizada.

// 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

Reemplace la consulta a continuación para corregir el error 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
  );
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.