Function Reference: geodir_get_widget_listings
Summary
Retrieve listings/count using requested filter parameters.
Global Values
- $wpdb
- (object) (required) WordPress Database object.
- Default: None
- $plugin_prefix
- (string) (required) Geodirectory plugin table prefix.
- Default: None
- $table_prefix
- (string) (required) WordPress Database Table prefix.
- Default: None
Package
GeoDirectory
Parameters
- $query_args
- (array) (required) The query array.
- Default: None
- $count_only
- (int|bool) (required) If true returns listings count only, otherwise returns array.
- Default: None
Return Values
- (mixed)
- Result object.
Change Log
Since: 1.0.0
1.4.2 New parameter $count_only added
1.6.11 FIXED: GD listings query returns wrong total when category has sub categories.
1.6.18 Allow order by custom field in widget listings results sorting.
Filters
‘geodir_filter_widget_listings_fields’ [Line: 2305]
‘geodir_filter_widget_listings_join’ [Line: 2329]
‘geodir_filter_widget_listings_where’ [Line: 2350]
‘geodir_filter_widget_listings_groupby’ [Line: 2362]
Source File
geodir_get_widget_listings() is located in geodirectory-functions/general_functions.php [Line: 2286]
Source Code
function geodir_get_widget_listings( $query_args = array(), $count_only = false ) { global $wpdb, $plugin_prefix, $table_prefix; $GLOBALS['gd_query_args_widgets'] = $query_args; $gd_query_args_widgets = $query_args; $post_type = empty( $query_args['post_type'] ) ? 'gd_place' : $query_args['post_type']; $table = $plugin_prefix . $post_type . '_detail'; $supports_wpml = geodir_wpml_is_post_type_translated( $post_type ); $fields = $wpdb->posts . ".*, " . $table . ".*"; /** * Filter widget listing fields string part that is being used for query. * * @since 1.0.0 * * @param string $fields Fields string. * @param string $table Table name. * @param string $post_type Post type. */ $fields = apply_filters( 'geodir_filter_widget_listings_fields', $fields, $table, $post_type ); $join = "INNER JOIN " . $table . " ON (" . $table . ".post_id = " . $wpdb->posts . ".ID)"; ########### WPML ########### if ( $supports_wpml ) { global $sitepress; $lang_code = ICL_LANGUAGE_CODE; if ( $lang_code ) { $join .= " JOIN " . $table_prefix . "icl_translations icl_t ON icl_t.element_id = " . $table_prefix . "posts.ID"; } } ########### WPML ########### /** * Filter widget listing join clause string part that is being used for query. * * @since 1.0.0 * * @param string $join Join clause string. * @param string $post_type Post type. */ $join = apply_filters( 'geodir_filter_widget_listings_join', $join, $post_type ); $post_status = is_super_admin() ? " OR " . $wpdb->posts . ".post_status = 'private'" : ''; $where = " AND ( " . $wpdb->posts . ".post_status = 'publish' " . $post_status . " ) AND " . $wpdb->posts . ".post_type = '" . $post_type . "'"; ########### WPML ########### if ( $supports_wpml ) { if ( $lang_code ) { $where .= " AND icl_t.language_code = '$lang_code' AND icl_t.element_type = 'post_$post_type' "; } } ########### WPML ########### /** * Filter widget listing where clause string part that is being used for query. * * @since 1.0.0 * * @param string $where Where clause string. * @param string $post_type Post type. */ $where = apply_filters( 'geodir_filter_widget_listings_where', $where, $post_type ); $where = $where != '' ? " WHERE 1=1 " . $where : ''; $groupby = " GROUP BY $wpdb->posts.ID "; //@todo is this needed? faster without /** * Filter widget listing groupby clause string part that is being used for query. * * @since 1.0.0 * * @param string $groupby Group by clause string. * @param string $post_type Post type. */ $groupby = apply_filters( 'geodir_filter_widget_listings_groupby', $groupby, $post_type ); if ( $count_only ) { $sql = "SELECT COUNT(DISTINCT " . $wpdb->posts . ".ID) AS total FROM " . $wpdb->posts . " " . $join . " " . $where; $rows = (int) $wpdb->get_var( $sql ); } else { $orderby = geodir_widget_listings_get_order( $query_args ); /** * Filter widget listing orderby clause string part that is being used for query. * * @since 1.0.0 * * @param string $orderby Order by clause string. * @param string $table Table name. * @param string $post_type Post type. */ $orderby = apply_filters( 'geodir_filter_widget_listings_orderby', $orderby, $table, $post_type ); $second_orderby = array(); if ( strpos( $orderby, strtolower( $table . ".is_featured" ) ) === false ) { $second_orderby[] = $table . ".is_featured ASC"; } if ( strpos( $orderby, strtolower( $wpdb->posts . ".post_date" ) ) === false ) { $second_orderby[] = $wpdb->posts . ".post_date DESC"; } if ( strpos( $orderby, strtolower( $wpdb->posts . ".post_title" ) ) === false ) { $second_orderby[] = $wpdb->posts . ".post_title ASC"; } if ( !empty( $second_orderby ) ) { $orderby .= implode( ', ', $second_orderby ); } if ( !empty( $orderby ) ) { $orderby = trim( $orderby ); $orderby = rtrim( $orderby, "," ); } $orderby = $orderby != '' ? " ORDER BY " . $orderby : ''; $limit = ! empty( $query_args['posts_per_page'] ) ? $query_args['posts_per_page'] : 5; /** * Filter widget listing limit that is being used for query. * * @since 1.0.0 * * @param int $limit Query results limit. * @param string $post_type Post type. */ $limit = apply_filters( 'geodir_filter_widget_listings_limit', $limit, $post_type ); $page = ! empty( $query_args['pageno'] ) ? absint( $query_args['pageno'] ) : 1; if ( ! $page ) { $page = 1; } $limit = (int) $limit > 0 ? " LIMIT " . absint( ( $page - 1 ) * (int) $limit ) . ", " . (int) $limit : ""; //@todo removed SQL_CALC_FOUND_ROWS from below as don't think it is needed and query is faster without $sql = "SELECT " . $fields . " FROM " . $wpdb->posts . " " . $join . " " . $where . " " . $groupby . " " . $orderby . " " . $limit; $rows = $wpdb->get_results( $sql ); } unset( $GLOBALS['gd_query_args_widgets'] ); unset( $gd_query_args_widgets ); return $rows; }