ATENCIÓN AL CLIENTE: +34 923 199 148

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_titles+LIKEs*('[^']+')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:

Contenido relacionado