This is my first time posting a question here. I have this problem that I feel that I am soooo close to solve, but can't manage to do it.
I have a custom taxonomy called "aplication" and another called "segment". Each "aplication" term has an "segment" term associated with it trought a custom field (ACF).
What I'm trying to do is to sort the "aplication" terms alphabetically by their associated "segment" term in the edit-tag?taxonomy=aplication page.
I managed to add the sortable "segment" column into the page through the code below:
// Add the "segment" column to the list of "aplication" terms
add_filter('manage_edit-aplication_columns', function( $columns ) {
$columns['aplication_segment'] = __( 'Segment', 'textdomain' );
return $columns;
});
// Add data to the "segment" column created above
add_action( 'manage_aplication_custom_column', function( $value, $column, $aplication_id ) {
if ( $column == 'aplication_segment') {
$segment_ID = get_field( 'aplication_segment', get_term($aplication_id, 'aplication') ); // The custom field for the aplications returns the segment ID
$segment = get_term( $segment_ID, 'segment' );
$value = $segment -> name;
echo $segment->name;
}
}, 10, 3);
// Make the "segment" column sortable
add_filter('manage_edit-aplication_sortable_columns', function( $columns ) {
$columns['aplication_segment'] = 'aplication_segment';
return $columns;
});
Now, to sort the "aplication" terms I did this:
add_action('pre_get_terms', function( $term_query ) {
global $current_screen;
global $wpdb;
if ( ($current_screen) && $current_screen->id === 'edit-aplication' ) {
if ( $term_query -> query_vars['orderby'] === 'aplication_segment' ) {
$sql =
"SELECT ttm.term_id, ttm.name, ttm.slug, ttm.term_group, ttm.term_order
FROM
(SELECT wp_terms.term_id, wp_terms.name, wp_term_taxonomy.taxonomy
FROM wp_terms
INNER JOIN wp_term_taxonomy
ON wp_terms.term_id = wp_term_taxonomy.term_id
AND wp_term_taxonomy.taxonomy = 'segment'
ORDER BY wp_terms.name) as ttt
INNER JOIN
(SELECT wp_terms.*, wp_termmeta.meta_value
FROM wp_terms
INNER JOIN wp_termmeta
ON wp_terms.term_id = wp_termmeta.term_id
AND wp_termmeta.meta_key = 'aplication_segment'
ORDER BY wp_terms.name) as ttm
ON ttt.term_id = ttm.meta_value
ORDER BY ttt.name {$term_query->query_vars['order']}";
return $wpdb -> get_results( $sql );
};
}
}, 10, 1);
This query works, it gives me the result that I need (I didn't translated those to english):
Array
(
[0] => stdClass Object
(
[term_id] => 147
[name] => Puxadores
[slug] => puxadores-moveleiros
[term_group] => 0
[term_order] => 0
)
[1] => stdClass Object
(
[term_id] => 3391
[name] => Cantoneiras
[slug] => cantoneiras
[term_group] => 0
[term_order] => 0
)
[2] => stdClass Object
(
[term_id] => 150
[name] => Automotivo
[slug] => automotivo
[term_group] => 0
[term_order] => 0
)
[3] => stdClass Object
(
[term_id] => 149
[name] => Dissipadores
[slug] => dissipadores
[term_group] => 0
[term_order] => 0
)
[4] => stdClass Object
(
[term_id] => 3393
[name] => Luminárias
[slug] => luminarias
[term_group] => 0
[term_order] => 0
)
[5] => stdClass Object
(
[term_id] => 148
[name] => Base Divisória
[slug] => base-divisoria
[term_group] => 0
[term_order] => 0
)
[6] => stdClass Object
(
[term_id] => 3392
[name] => Esquadrias
[slug] => esquadrias
[term_group] => 0
[term_order] => 0
)
)
The only problem is that I can't manage to show the result in the "aplication" terms table. It keeps sorting by the "aplication" term name.
I appreciate anyone who can try and help me with this.
pre_get_terms
isn't an opportunity to return a new set of results, it's an opportunity to modify the parameters on theWP_Term_Query
object before it executes. That SQL query has no place in that action, there's been a misunderstandingWP_Term_Query
can already sort by meta, and that by focusing on the SQL you're severely limiting the number of people who are capable of answering the question. Needing to use those filters is usually a big red flag 🚩