php - página - En Wordpress, ¿cómo configuro el orden predeterminado de administración para un tipo de publicación personalizado en una columna personalizada?
plantilla de la meta description (2)
El problema es que ejecuta la clientarea_default_order
llamada clientarea_default_order
demasiado tarde.
Para arreglar eso solo tienes que cambiar la prioridad de la predeterminada que es 10
:
add_action( ''pre_get_posts'',''clientarea_default_order'');
a la prioridad del 9
:
add_action( ''pre_get_posts'',''clientarea_default_order'', 9 );
Pero en realidad no necesitas dos pre_get_posts
llamada pre_get_posts
.
Puedes combinarlos:
Ejemplo 1
is_admin() && add_action( ''pre_get_posts'', ''extranet_orderby'' );
function extranet_orderby( $query )
{
// Nothing to do:
if( ! $query->is_main_query() || ''clientarea'' != $query->get( ''post_type'' ) )
return;
//-------------------------------------------
// Modify the ''orderby'' and ''meta_key'' parts
//-------------------------------------------
$orderby = $query->get( ''orderby'');
switch ( $orderby )
{
case ''extranet_sort_office'':
$query->set( ''meta_key'', ''extranet_case_office'' );
$query->set( ''orderby'', ''meta_value_num'' );
break;
case ''extranet_sort_date'':
$query->set( ''meta_key'', ''extranet_appointment_date'' );
$query->set( ''orderby'', ''meta_value'' );
break;
case '''': // <-- The default empty case
$query->set( ''meta_key'', ''extranet_appointment_date'' );
$query->set( ''orderby'', ''meta_value'' );
break;
case ''extranet_sort_type'':
$query->set( ''meta_key'', ''extranet_appointment_type'' );
$query->set( ''orderby'', ''meta_value'' );
break;
case ''extranet_sort_IP'':
$query->set( ''meta_key'', ''extranet_insolvency_practioner'' );
$query->set( ''orderby'', ''meta_value_num'' );
break;
default:
break;
}
}
donde agregamos una comprobación de consulta principal y un caso de conmutador vacío .
Ejemplo # 2
Aquí hay otro enfoque, sin la parte de switch
(PHP 5.4+):
is_admin() && add_action( ''pre_get_posts'', ''extranet_orderby'' );
function extranet_orderby( $query )
{
// Nothing to do
if( ! $query->is_main_query() || ''clientarea'' != $query->get( ''post_type'' ) )
return;
//-------------------------------------------
// Modify the ''orderby'' and ''meta_key'' parts
//-------------------------------------------
$orderby = strtolower( $query->get( ''orderby'') );
$mods = [
''office'' => [ ''meta_key'' => ''extranet_sort_office'', ''orderby'' => ''meta_value_num'' ],
''date'' => [ ''meta_key'' => ''extranet_appointment_date'', ''orderby'' => ''meta_value'' ],
'''' => [ ''meta_key'' => ''extranet_appointment_date'', ''orderby'' => ''meta_value'' ],
''type'' => [ ''meta_key'' => ''extranet_sort_type'', ''orderby'' => ''meta_value_num'' ],
''ip'' => [ ''meta_key'' => ''extranet_insolvency_practioner'', ''orderby'' => ''meta_value_num'' ],
];
$key = ''extranet_sort_'' . $orderby;
if( isset( $mods[$key] ) )
{
$query->set( ''meta_key'', $mods[$key][''meta_key''] );
$query->set( ''orderby'', $mods[$key][''orderby''] );
}
}
He configurado un tipo de publicación personalizada llamada área de cliente, y configuré varias columnas personalizadas para él en el área de administración; las columnas personalizadas son todos los campos de metadatos personalizados, como puede ver en mi código. Me gustaría ordenar por ''Fecha de cita'' descendente por defecto.
Todas las columnas funcionan bien y pueden ordenarse manualmente como se esperaba, pero no puedo hacer que funcione el orden predeterminado.
Si cambio el campo de clasificación predeterminado a un campo estándar (por ejemplo, ''título''), funciona como se espera; parece que no funciona cuando intento configurar una columna personalizada como el orden predeterminado. El orden funciona (es decir, puedo cambiar entre asc y desc de forma predeterminada incluso con una columna personalizada), pero no retoma el pedido, por lo que vuelve a la clasificación por la fecha en que se publicó la publicación personalizada.
¿Qué me estoy perdiendo?
Mi código es el siguiente:
add_action( ''manage_posts_custom_column'' , ''custom_columns'', 10, 2 );
function custom_columns( $column, $post_id ) {
global $wpdb;
switch ( $column ) {
case ''extranet_case_office'':
$get_office_ID = get_post_meta( $post_id, ''extranet_case_office'', true );
$get_office_name = $wpdb->get_results(''SELECT post_title FROM `cn_bf_posts` WHERE `ID` = ''.$get_office_ID);
echo $get_office_name[0]->post_title;
break;
case ''extranet_appointment_date'':
echo date(''d/m/Y'',strtotime(get_post_meta( $post_id, ''extranet_appointment_date'', true )));
break;
case ''extranet_appointment_type'':
echo get_post_meta( $post_id, ''extranet_appointment_type'', true );
break;
case ''extranet_insolvency_practioner'':
$get_person_ID = get_post_meta( $post_id, ''extranet_insolvency_practioner'', true );
$get_person_name = $wpdb->get_results(''SELECT post_title FROM `cn_bf_posts` WHERE `ID` = ''.$get_person_ID);
echo $get_person_name[0]->post_title;
break;
default:
break;
}
}
add_filter( ''manage_edit-clientarea_sortable_columns'', ''my_sortable_clientarea_columns'' );
function my_sortable_clientarea_columns( $columns ) {
$columns[''extranet_case_office''] = ''extranet_sort_office'';
$columns[''extranet_appointment_date''] = ''extranet_sort_date'';
$columns[''extranet_appointment_type''] = ''extranet_sort_type'';
$columns[''extranet_insolvency_practioner''] = ''extranet_sort_IP'';
return $columns;
}
add_action( ''pre_get_posts'', ''extranet_orderby'' );
function extranet_orderby( $query ) {
if( ! is_admin() )
return;
$orderby = $query->get( ''orderby'');
switch ( $orderby ) {
case ''extranet_sort_office'':
$query->set(''meta_key'',''extranet_case_office'');
$query->set(''orderby'',''meta_value_num'');
break;
case ''extranet_sort_date'':
$query->set(''meta_key'',''extranet_appointment_date'');
$query->set(''orderby'',''meta_value'');
break;
case ''extranet_sort_type'':
$query->set(''meta_key'',''extranet_appointment_type'');
$query->set(''orderby'',''meta_value'');
break;
case ''extranet_sort_IP'':
$query->set(''meta_key'',''extranet_insolvency_practioner'');
$query->set(''orderby'',''meta_value_num'');
break;
default:
break;
}
}
add_action(''pre_get_posts'',''clientarea_default_order'');
function clientarea_default_order( $query ){
if( $query->get(''post_type'')==''clientarea'' ){
if( $query->get(''orderby'') == '''' )
$query->set(''orderby'',''extranet_sort_date'');
if( $query->get(''order'') == '''' )
$query->set(''order'',''desc'');
}
}
Intenta cambiar la acción y la función clientarea_default_order para esto:
add_action(''pre_get_posts'', ''clientarea_default_order'', 99);
function clientarea_default_order($query) {
if ($query->get(''post_type'') == ''clientarea'') {
if ($query->get(''orderby'') == '''') {
$query->set(''orderby'', ''extranet_sort_date'');
$query->set(''meta_key'', ''extranet_appointment_date'');
}
if ($query->get(''order'') == '''') {
$query->set(''order'', ''DESC'');
}
}
}