Personalizar las columnas en el backend y búsqueda por campos personalizados

WebProgramacion > Recursos sobre informática y tecnología > Programacion > WordPress > Personalizar las columnas en el backend y búsqueda por campos personalizados
Personalizar las columnas en el backend y búsqueda por campos personalizados
Personalizar las columnas en el backend y búsqueda por campos personalizados

Con el siguiente ejemplo de código vamos a ver cómo añadir columnas en el navegador de posts de los tipos de post personalizados, así como extender la búsqueda para que busque por todos los campos.

Cuando creamos un tipo personalizado de post (CPT: Custom Post Type) es muy habitual usar el plugin Advanced Custom Fields para crear campos personalizados. Cuando naveguemos por los diferentes posts, vamos a observar que los campos personalizados no aparecen en la tabla de campos, como podemos ver en la siguiente imagen:

Y realmente lo que deseamos es que sí aparezcan, como podemos ver en la siguiente imagen:

Añadir columnas con los tipos de datos personalizados

Para resolverlo, vamos a necesitar el siguiente código (podemos darlo de alta en el plugin Code Snippets o editar el fichero functions.php):

add_filter( 'manage_TIPOPOST_posts_columns', 'personalizar_columnas' );
function personalizar_columnas( $columns ) {
    $columns = array(
      'cb' => $columns['cb'],
      'title' => __( 'Title' ),
      'campo_personalizado' => __( 'Campo personalizado' ),
      'date' => __( 'Fecha', 'smashing' ),
    );
  return $columns;
}

add_action( 'manage_TIPOPOST_posts_custom_column', 'personalizar_contenidos', 10, 2);
function personalizar_contenidos( $column, $post_id ) {
  switch ($column)
  {
    case 'campo_personalizado':
      echo get_field( 'campo_personalizado', $post_id );
      break;
  }
}

Añadir los tipos de datos personalizados a los resultados de búsqueda del Backend

Mediante el siguiente código, vamos a ver cómo añadir los contenidos de los campos personalizados de los diferentes posts a los resultados de búsqueda:

function cf_search_join( $join ) {
    global $wpdb;

    if ( is_search() ) {    
        $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }

    return $join;
}
add_filter('posts_join', 'cf_search_join' );

function cf_search_where( $where ) {
    global $pagenow, $wpdb;

    if ( is_search() ) {
        $where = preg_replace(
            "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
            "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
    }

    return $where;
}
add_filter( 'posts_where', 'cf_search_where' );

function cf_search_distinct( $where ) {
    global $wpdb;

    if ( is_search() ) {
        return "DISTINCT";
    }

    return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );

Vídeotutorial explicativo

En el siguiente vídeotutorial, muestro un ejemplo de cómo montar este sistema sobre un WordPress real:

Resultado de libros sin los custom fields Resultado de libros con los custom fields

Podría interesarte...

Custom Post Types con Custom Fields usando Elementor Pro
Ejemplo donde vamos a ver cómo crear una plantilla para tener un single post usando Elementor Pro y su funcionamiento ...
Advanced Custom Fields: personaliza los campos de WordPress
Si vas a almacenar cualquier tipo de información estructurada en WordPress, Advanced Custom Fields va a ser un plugin ...
Mantenimiento de WordPress: consultoría y gestión
Realizamos el mantenimiento y soporte de WordPress, gestionando y optimizando tu web, blog o tienda online para obtener ...

Deja tu opinión

la política de privacidad que declaro haber leído.

(*) Campos necesarios. El correo electrónico no será público.