Inventory_Presser_Plugin::add_orderby_to_query( object $query )
Filter callback that adds an ORDER BY clause to the main query when a user requests a list of vehicles.
On This Page
Parameters Parameters
- $query
-
(object) (Required) An instance of the WP_Query class.
Return Return
(void)
Source Source
File: inventory-presser.php
$role = get_role( 'administrator' ); if ( ! $role ) { return; } $role->add_cap( 'edit_' . INVP::POST_TYPE ); $role->add_cap( 'read_' . INVP::POST_TYPE ); $role->add_cap( 'delete_' . INVP::POST_TYPE ); $role->add_cap( 'delete_published_' . INVP::POST_TYPE . 's' ); $role->add_cap( 'edit_' . INVP::POST_TYPE . 's' ); $role->add_cap( 'edit_others_' . INVP::POST_TYPE . 's' ); $role->add_cap( 'edit_published_' . INVP::POST_TYPE . 's' ); $role->add_cap( 'publish_' . INVP::POST_TYPE . 's' ); $role->add_cap( 'read_private_' . INVP::POST_TYPE . 's' ); } /** * Filter callback that adds an ORDER BY clause to the main query when a * user requests a list of vehicles. * * @param object $query An instance of the WP_Query class. * @return void */ public function add_orderby_to_query( $query ) { // Do not mess with the query if it's not the main one and our CPT. if ( apply_filters( 'invp_apply_orderby_to_main_query_only', true ) && ! $query->is_main_query() ) { return; } if ( ! is_post_type_archive( INVP::POST_TYPE ) ) { return; } add_filter( 'posts_clauses', array( $this, 'modify_query_orderby' ) ); $settings = INVP::settings(); if ( empty( $_GET['orderby'] ) && empty( $settings['sort_vehicles_by'] ) ) { return; } /** * The field we want to order by is either in $_GET['orderby'] when * the user has chosen to reorder posts or saved in the plugin * settings 'default-sort-key.' The sort direction is in * $_GET['order'] or 'sort_vehicles_order.' */ $direction = $settings['sort_vehicles_order']; if ( isset( $_GET['order'] ) ) { $direction = sanitize_text_field( wp_unslash( $_GET['order'] ) ); } $key = $settings['sort_vehicles_by']; // Backwards compatibility for pre 13.7.1 when there was a bug. if ( 'date_entered' === $key ) { $key = 'post_date'; } if ( 'last_modified' === $key ) { $key = 'post_modified'; } if ( isset( $_GET['orderby'] ) ) { $key = sanitize_text_field( wp_unslash( $_GET['orderby'] ) ); } // post_date and post_modified are not meta keys. if ( in_array( $key, array( 'post_date', 'post_modified' ), true ) ) { $query->set( 'orderby', $key ); $query->set( 'order', $direction ); return; } // Make sure the meta key has the prefix. $key = apply_filters( 'invp_prefix_meta_key', $key ); $query->set( 'meta_key', $key ); /** * Maybe append to the meta_query if it is already set. If we are * sorting by make, then we want to also add a secondary sort of model * and a tertiary sort of trim. That's what users want. Apply the same * logic to sorts by year and model. */ $old = $query->get( 'meta_query', array() ); switch ( apply_filters( 'invp_unprefix_meta_key', $query->get( 'meta_key' ) ) ) { case 'make': $query->set( 'meta_query', array_merge( $old, array( 'relation' => 'AND', array( 'relation' => 'OR', array( 'key' => apply_filters( 'invp_prefix_meta_key', 'model' ), 'compare' => 'NOT EXISTS', ), array( 'key' => apply_filters( 'invp_prefix_meta_key', 'model' ), 'compare' => 'EXISTS', ), ), array( 'relation' => 'OR', array( 'key' => apply_filters( 'invp_prefix_meta_key', 'trim' ), 'compare' => 'NOT EXISTS', ), array( 'key' => apply_filters( 'invp_prefix_meta_key', 'trim' ), 'compare' => 'EXISTS', ), ), ) ) ); break; case 'model': $query->set( 'meta_query', array_merge( $old, array( 'relation' => 'AND', array( 'relation' => 'OR', array( 'key' => apply_filters( 'invp_prefix_meta_key', 'model' ), 'compare' => 'NOT EXISTS', ), array( 'key' => apply_filters( 'invp_prefix_meta_key', 'model' ), 'compare' => 'EXISTS', ), ), array( 'relation' => 'OR', array( 'key' => apply_filters( 'invp_prefix_meta_key', 'trim' ), 'compare' => 'NOT EXISTS', ), array( 'key' => apply_filters( 'invp_prefix_meta_key', 'trim' ), 'compare' => 'EXISTS', ), ), ) ) ); break; case 'year': $query->set( 'meta_query', array_merge( $old, array( 'relation' => 'AND', array( 'relation' => 'OR', array( 'key' => apply_filters( 'invp_prefix_meta_key', 'year' ), 'compare' => 'NOT EXISTS', ), array( 'key' => apply_filters( 'invp_prefix_meta_key', 'year' ), 'compare' => 'EXISTS', ), ), array( 'relation' => 'OR', array( 'key' => apply_filters( 'invp_prefix_meta_key', 'make' ), 'compare' => 'NOT EXISTS', ), array( 'key' => apply_filters( 'invp_prefix_meta_key', 'make' ), 'compare' => 'EXISTS', ), ), array( 'relation' => 'OR', array( 'key' => apply_filters( 'invp_prefix_meta_key', 'model' ), 'compare' => 'NOT EXISTS', ), array( 'key' => apply_filters( 'invp_prefix_meta_key', 'model' ), 'compare' => 'EXISTS', ), ), array( 'relation' => 'OR', array( 'key' => apply_filters( 'invp_prefix_meta_key', 'trim' ), 'compare' => 'NOT EXISTS', ), array( 'key' => apply_filters( 'invp_prefix_meta_key', 'trim' ), 'compare' => 'EXISTS', ), ), ) ) ); break; // Boat fields might not exist on all vehicles. Do not require them. case 'beam': case 'condition_boat': case 'draft': case 'engine_count': case 'engine_make': case 'engine_model': case 'horsepower': case 'hull_material': case 'length': $query->set( 'meta_key', '' ); $query->set( 'meta_query', array_merge( $old, array( 'relation' => 'OR', array( 'key' => $key, 'compare' => 'NOT EXISTS', ), array( 'key' => $key, 'compare' => 'EXISTS',
Expand full source codeCollapse full source codeView on Github