Function Reference: geodir_posts_order_by_custom_sort

Summary

Listing orderby custom sort.

Global Values

$wpdb
(object) (required) WordPress Database object.

Default: None

Package

GeoDirectory

Parameters

$orderby
(string) (required) The orderby query string.

Default: None
$sort_by
(string) (required) Sortby query string.

Default: None
$table
(string) (required) Listing table name.

Default: None

Return Values

(string)
  • Modified orderby query.

Change Log

Since: 1.0.0

Source File

geodir_posts_order_by_custom_sort() is located in geodirectory-functions/listing_filters.php [Line: 510]

Source Code

function geodir_posts_order_by_custom_sort($orderby, $sort_by, $table)
{

    global $wpdb;

    if ($sort_by != '' && (!is_search() || ( isset($_REQUEST['s']) && isset($_REQUEST['snear']) && $_REQUEST['snear']=='' && ( $_REQUEST['s']=='' ||  $_REQUEST['s']==' ') ) )) {

        $sort_array = explode('_', $sort_by);

        $sort_by_count = count($sort_array);

        $order = $sort_array[$sort_by_count - 1];

        if ($sort_by_count > 1 && ($order == 'asc' || $order == 'desc')) {

            $sort_by = str_replace('_' . $order, '', $sort_by);

            switch ($sort_by):

                case 'post_date':
                case 'comment_count':

                    $orderby = "$wpdb->posts." . $sort_by . " " . $order . ", ".$table . ".overall_rating " . $order . ", ";
                    break;

                case 'distance':
                    $orderby = $sort_by . " " . $order . ", ";
                    break;


                // sort by rating
                case 'overall_rating':

                    $use_bayesian = apply_filters('gd_use_bayesian',true,$table);
                    $avg_rating = 0;
                    if($use_bayesian){
                        $avg_num_votes = get_transient( 'gd_avg_num_votes_'.$table );
                        if(!$avg_num_votes){
                            $avg_num_votes = $wpdb->get_var("SELECT SUM(rating_count) FROM $table");
                            if($avg_num_votes){

                                $avg_rating = get_transient( 'gd_avg_rating_'.$table );
                                if(!$avg_rating){
                                    $avg_rating = $wpdb->get_var("SELECT SUM(overall_rating) FROM $table")/$avg_num_votes;
                                }
                                set_transient( 'gd_avg_num_votes_'.$table, $avg_num_votes, 12 * HOUR_IN_SECONDS );
                                set_transient( 'gd_avg_rating_'.$table, $avg_rating , 12 * HOUR_IN_SECONDS );
                            }
                        }

                        if(!$avg_num_votes){ $avg_num_votes = 0;}

                        $orderby = " (( $avg_num_votes * $avg_rating ) + (" . $table . ".rating_count * " . $table . ".overall_rating ))  / ( $avg_num_votes + " . $table . ".rating_count )  $order , ";

                        //$orderby = " ( " . $table . ".rating_count * " . $table . ".overall_rating ) + (" . $table . ".rating_count * " . $table . ".overall_rating )   / ( " . $table . ".rating_count + " . $table . ".rating_count )  $order , "; // seems to work mostly with no extra overheads
                    }else{
                        $orderby = " " . $table . "." . $sort_by . "  " . $order . ", " . $table . ".rating_count " . $order . ", ";
                    }

                    break;


                default:
                    if (geodir_column_exist($table, $sort_by)) {
						$orderby = $table . "." . $sort_by . " " . $order . ", ";
					}
                    break;

            endswitch;

        }

    }

    return $orderby;
}