[ Index ]

MailPress 544

[ Index ]     [ Classes ]     [ Functions ]     [ Variables ]     [ Constants ]     [ Statistics ]    

title

Body

[close]

/mp-includes/class/ -> MP_Query.class.php (source)

   1  <?php
   2  class MP_Query 
   3  {
   4  
   5      var $query;
   6      var $query_vars = array();
   7      var $queried_object;
   8      var $queried_object_id;
   9      var $request;
  10      var $mails;
  11      var $mail_count = 0;
  12      var $current_mail = -1;
  13      var $in_the_loop = false;
  14      var $mail;
  15      var $found_mails = 0;
  16  
  17  	function __construct($query = '')
  18      {
  19          if ( !empty($query) ) $this->query($query);
  20      }
  21  
  22      function &query($query = '')
  23      {
  24          $this->parse_query($query);
  25          return $this->get_mails();
  26      }
  27  
  28  	function parse_query($query) 
  29      {
  30          if ( !empty($query) || !isset($this->query) ) 
  31          {
  32              $this->init();
  33              if ( is_array($query) )    $this->query_vars = $query;
  34              else                parse_str($query, $this->query_vars);
  35              $this->query = $query;
  36          }
  37  
  38          $this->query_vars = $this->fill_query_vars($this->query_vars);
  39          $qv = &$this->query_vars;
  40  
  41          $absints = array(
  42                'day'
  43              , 'm'
  44              , 'mail'
  45              , 'monthnum'
  46              , 'w'    
  47              , 'year'
  48          );
  49          foreach ( $absints as $absint ) if ( isset($qv[$absint])) $qv[$absint] = absint($qv[$absint]);
  50          if ( '' !== $qv['hour'] ) $qv['hour'] = absint($qv['hour']);
  51          if ( '' !== $qv['minute'] ) $qv['minute'] = absint($qv['minute']);
  52          if ( '' !== $qv['second'] ) $qv['second'] = absint($qv['second']);
  53      }
  54  
  55  	function init() 
  56      {
  57          unset($this->mails);
  58          unset($this->query);
  59          $this->query_vars = array();
  60          unset($this->queried_object);
  61          unset($this->queried_object_id);
  62          $this->mail_count = 0;
  63          $this->current_mail = -1;
  64          $this->in_the_loop = false;
  65  
  66          $this->init_query_flags();
  67      }
  68  
  69  	function init_query_flags() {}
  70  
  71  	function fill_query_vars($array) {
  72          $keys = array(
  73              'error'
  74  
  75              , 'day'
  76              , 'w'    
  77              , 'monthnum'
  78              , 'year'
  79              , 'm'
  80              , 'hour'
  81              , 'minute'
  82              , 'second'
  83  
  84              , 'mail'
  85              , 'Theme'
  86              , 'Template'
  87  
  88              , 'fromemail'
  89              , 'fromname'
  90              , 'toemail'
  91              , 'author_name'
  92  
  93              , 'meta_key'
  94              , 'meta_value'
  95  ,'paged'
  96              , 's'
  97          );
  98  
  99          foreach ( $keys as $key ) if ( !isset($array[$key])) $array[$key] = '';
 100  
 101          $array_keys = array(
 102              'emails'
 103              , 'mail__in'
 104              , 'mail__not_in'
 105              , 'Theme__in'
 106              , 'Theme__not_in'
 107              , 'Template__in'
 108              , 'Template__not_in'
 109          );
 110  
 111          foreach ( $array_keys as $key ) if ( !isset($array[$key]))    $array[$key] = array();
 112  
 113          return $array;
 114      }
 115  
 116  	function parse_query_vars() 
 117      {
 118          $this->parse_query('');
 119      }
 120  
 121  	function get($query_var) 
 122      {
 123          return ( isset($this->query_vars[$query_var]) ) ? $this->query_vars[$query_var] : '';
 124      }
 125  
 126  	function set($query_var, $value) 
 127      {
 128          $this->query_vars[$query_var] = $value;
 129      }
 130  
 131      function &get_mails() {
 132          global $wpdb;
 133  
 134          // Shorthand.
 135          $q = &$this->query_vars;
 136  
 137          $q = $this->fill_query_vars($q);
 138  
 139          // First let's clear some variables
 140          $distinct = '';
 141          $whichauthor = '';
 142          $where = '';
 143          $limits = '';
 144          $join = '';
 145          $search = '';
 146          $groupby = '';
 147          $fields = "$wpdb->mp_mails.*";
 148          $mail_status_join = false;
 149          $page = 1;
 150  
 151          if ( !isset($q['caller_get_mails']) ) $q['caller_get_mails'] = false;
 152  
 153  //        if ( !isset($q['suppress_filters']) ) 
 154              $q['suppress_filters'] = true;
 155  
 156          if ( !isset($q['mails_per_page']) || $q['mails_per_page'] == 0 ) $q['mails_per_page'] = get_option('posts_per_page');
 157          if ( isset($q['showmails']) && $q['showmails'] ) 
 158          {
 159              $q['showmails'] = (int) $q['showmails'];
 160              $q['mails_per_page'] = $q['showmails'];
 161          }
 162          if ( !isset($q['nopaging']) ) $q['nopaging'] = ( $q['mails_per_page'] == -1 );
 163  
 164          $q['mails_per_page'] = (int) $q['mails_per_page'];
 165          if ( $q['mails_per_page'] < -1 )     $q['mails_per_page'] = abs($q['mails_per_page']);
 166          elseif ( $q['mails_per_page'] == 0 ) $q['mails_per_page'] = 1;
 167  
 168          // If true, forcibly turns off SQL_CALC_FOUND_ROWS even when limits are present.
 169          if ( isset($q['no_found_rows']) )
 170              $q['no_found_rows'] = (bool) $q['no_found_rows'];
 171          else
 172              $q['no_found_rows'] = false;
 173  
 174          // If a month is specified in the querystring, load that month
 175          if ( $q['m'] ) {
 176              $q['m'] = '' . preg_replace('|[^0-9]|', '', $q['m']);
 177              $where .= " AND YEAR($wpdb->mp_mails.sent)=" . substr($q['m'], 0, 4);
 178              if ( strlen($q['m']) > 5 )
 179                  $where .= " AND MONTH($wpdb->mp_mails.sent)=" . substr($q['m'], 4, 2);
 180              if ( strlen($q['m']) > 7 )
 181                  $where .= " AND DAYOFMONTH($wpdb->mp_mails.sent)=" . substr($q['m'], 6, 2);
 182              if ( strlen($q['m']) > 9 )
 183                  $where .= " AND HOUR($wpdb->mp_mails.sent)=" . substr($q['m'], 8, 2);
 184              if ( strlen($q['m']) > 11 )
 185                  $where .= " AND MINUTE($wpdb->mp_mails.sent)=" . substr($q['m'], 10, 2);
 186              if ( strlen($q['m']) > 13 )
 187                  $where .= " AND SECOND($wpdb->mp_mails.sent)=" . substr($q['m'], 12, 2);
 188          }
 189  
 190          if ( '' !== $q['hour'] )
 191              $where .= " AND HOUR($wpdb->mp_mails.sent)='" . $q['hour'] . "'";
 192  
 193          if ( '' !== $q['minute'] )
 194              $where .= " AND MINUTE($wpdb->mp_mails.sent)='" . $q['minute'] . "'";
 195  
 196          if ( '' !== $q['second'] )
 197              $where .= " AND SECOND($wpdb->mp_mails.sent)='" . $q['second'] . "'";
 198  
 199          if ( $q['year'] )
 200              $where .= " AND YEAR($wpdb->mp_mails.sent)='" . $q['year'] . "'";
 201  
 202          if ( $q['monthnum'] )
 203              $where .= " AND MONTH($wpdb->mp_mails.sent)='" . $q['monthnum'] . "'";
 204  
 205          if ( $q['day'] )
 206              $where .= " AND DAYOFMONTH($wpdb->mp_mails.sent)='" . $q['day'] . "'";
 207  
 208          if ( $q['w'] )
 209              $where .= ' AND ' . _wp_mysql_week( "`$wpdb->mp_mails`.`sent`" ) . " = '" . $q['w'] . "'";
 210  
 211          // If a mail number is specified, load that mail
 212          if ( $q['mail'] ) 
 213          {
 214              $where .= " AND {$wpdb->mp_mails}.id = " . $q['mail'];
 215          } 
 216          elseif ( $q['mail__in'] ) 
 217          {
 218              $mail__in = implode(',', array_map( 'absint', $q['mail__in'] ));
 219              $where .= " AND {$wpdb->mp_mails}.id IN ($mail__in)";
 220          }
 221          elseif ( $q['mail__not_in'] ) 
 222          {
 223              $mail__not_in = implode(',',  array_map( 'absint', $q['mail__not_in'] ));
 224              $where .= " AND {$wpdb->mp_mails}.id NOT IN ($mail__not_in)";
 225          }
 226  
 227          // If a Theme is specified, load that mail
 228          if ( $q['Theme'] ) 
 229          {
 230              $where .= " AND {$wpdb->mp_mails}.theme = '" . $q['Theme'] . "'";
 231          } 
 232          elseif ( $q['Theme__in'] ) 
 233          {
 234              $Theme__in = implode("','", $q['Theme__in'] );
 235              $where .= " AND {$wpdb->mp_mails}.theme IN ('$Theme__in')";
 236          }
 237          elseif ( $q['Theme__not_in'] ) 
 238          {
 239              $Theme__not_in = implode("','", $q['Theme__not_in'] );
 240              $where .= " AND {$wpdb->mp_mails}.theme NOT IN ('$Theme__not_in')";
 241          }
 242  
 243          // If a Template is specified, load that mail
 244          if ( $q['Template'] ) 
 245          {
 246              $where .= " AND {$wpdb->mp_mails}.template = '" . $q['Template'] . "'";
 247          } 
 248          elseif ( $q['Template__in'] ) 
 249          {
 250              $Template__in = implode("','", $q['Template__in'] );
 251              $where .= " AND {$wpdb->mp_mails}.template IN ('$Template__in')";
 252          }
 253          elseif ( $q['Template__not_in'] ) 
 254          {
 255              $Template__not_in = implode("','",  $q['Template__not_in'] );
 256              $where .= " AND {$wpdb->mp_mails}.template NOT IN ('$Template__not_in')";
 257          }
 258  
 259          // If a fromemail is specified, load that mail
 260          if ( $q['fromemail'] ) 
 261          {
 262              $where .= " AND {$wpdb->mp_mails}.fromemail = '" . $q['fromemail'] . "'";
 263          }
 264  
 265          // If a fromname is specified, load that mail
 266          if ( $q['fromname'] ) 
 267          {
 268              $where .= " AND {$wpdb->mp_mails}.fromname = '" . $q['fromname'] . "'";
 269          } 
 270  
 271          // If a fromemail is specified, load that mail
 272          if ( $q['toemail'] ) 
 273          {
 274              $where .= " AND {$wpdb->mp_mails}.toemail LIKE '%" . $q['toemail'] . "%'";
 275          } 
 276  
 277          // If a search pattern is specified, load the mails that match
 278          if ( !empty($q['s']) ) {
 279              // added slashes screw with quote grouping when done early, so done later
 280              $q['s'] = stripslashes($q['s']);
 281              if ( !empty($q['sentence']) ) {
 282                  $q['search_terms'] = array($q['s']);
 283              } else {
 284                  preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $q['s'], $matches);
 285                  $q['search_terms'] = array_map('_search_terms_tidy', $matches[0]);
 286              }
 287              $n = !empty($q['exact']) ? '' : '%';
 288              $searchand = '';
 289              foreach( (array) $q['search_terms'] as $term ) {
 290                  $term = addslashes_gpc($term);
 291                  $search .= "{$searchand}(($wpdb->mp_mails.toemail LIKE '{$n}{$term}{$n}') OR ($wpdb->mp_mails.toname LIKE '{$n}{$term}{$n}')) OR ($wpdb->mp_mails.subject LIKE '{$n}{$term}{$n}')) OR ($wpdb->mp_mails.html LIKE '{$n}{$term}{$n}')) OR ($wpdb->mp_mails.plaintext LIKE '{$n}{$term}{$n}'))";
 292                  $searchand = ' AND ';
 293              }
 294              $term = esc_sql($q['s']);
 295              if ( empty($q['sentence']) && count($q['search_terms']) > 1 && $q['search_terms'][0] != $q['s'] )
 296                  $search .= " OR ($wpdb->mp_mails.toemail LIKE '{$n}{$term}{$n}') OR ($wpdb->mp_mails.toname LIKE '{$n}{$term}{$n}')) OR ($wpdb->mp_mails.subject LIKE '{$n}{$term}{$n}')) OR ($wpdb->mp_mails.html LIKE '{$n}{$term}{$n}')) OR ($wpdb->mp_mails.plaintext LIKE '{$n}{$term}{$n}'))";
 297  
 298              if ( !empty($search) ) $search = " AND ({$search}) ";
 299          }
 300  
 301          // Allow plugins to contextually add/remove/modify the search section of the database query
 302          $search = apply_filters_ref_array('MailPress_mails_search', array( $search, $this ) );
 303  
 304          // Author/user stuff
 305  
 306          if ( empty($q['author']) || ($q['author'] == '0') ) {
 307              $whichauthor = '';
 308          } else {
 309              $q['author'] = (string)urldecode($q['author']);
 310              $q['author'] = addslashes_gpc($q['author']);
 311              if ( strpos($q['author'], '-') !== false ) {
 312                  $eq = '!=';
 313                  $andor = 'AND';
 314                  $q['author'] = explode('-', $q['author']);
 315                  $q['author'] = (string)absint($q['author'][1]);
 316              } else {
 317                  $eq = '=';
 318                  $andor = 'OR';
 319              }
 320              $author_array = preg_split('/[,\s]+/', $q['author']);
 321              $_author_array = array();
 322              foreach ( $author_array as $key => $_author )
 323                  $_author_array[] = "$wpdb->posts.post_author " . $eq . ' ' . absint($_author);
 324              $whichauthor .= ' AND (' . implode(" $andor ", $_author_array) . ')';
 325              unset($author_array, $_author_array);
 326          }
 327  
 328          // Author stuff for nice URLs
 329  
 330          if ( '' != $q['author_name'] ) {
 331              if ( strpos($q['author_name'], '/') !== false ) {
 332                  $q['author_name'] = explode('/', $q['author_name']);
 333                  if ( $q['author_name'][ count($q['author_name'])-1 ] ) {
 334                      $q['author_name'] = $q['author_name'][count($q['author_name'])-1]; // no trailing slash
 335                  } else {
 336                      $q['author_name'] = $q['author_name'][count($q['author_name'])-2]; // there was a trailling slash
 337                  }
 338              }
 339              $q['author_name'] = sanitize_title($q['author_name']);
 340              $q['author'] = get_user_by('slug', $q['author_name']);
 341              if ( $q['author'] )
 342                  $q['author'] = $q['author']->ID;
 343              $whichauthor .= " AND ($wpdb->posts.post_author = " . absint($q['author']) . ')';
 344          }
 345  
 346          $where .= $search . $whichauthor;
 347  
 348          if ( empty($q['order']) || ((strtoupper($q['order']) != 'ASC') && (strtoupper($q['order']) != 'DESC')) )
 349              $q['order'] = 'DESC';
 350  
 351          // Order by
 352          if ( empty($q['orderby']) ) 
 353          {
 354              $q['orderby'] = "$wpdb->mp_mails.sent " . $q['order'];
 355          } 
 356          elseif ( 'none' == $q['orderby'] ) 
 357          {
 358              $q['orderby'] = '';
 359          }
 360          else 
 361          {
 362              // Used to filter values
 363              $allowed_keys = array('id', 'author', 'sent', 'subject', 'rand');
 364              if ( !empty($q['meta_key']) ) {
 365                  $allowed_keys[] = $q['meta_key'];
 366                  $allowed_keys[] = 'meta_value';
 367                  $allowed_keys[] = 'meta_value_num';
 368              }
 369              $q['orderby'] = urldecode($q['orderby']);
 370              $q['orderby'] = addslashes_gpc($q['orderby']);
 371              $orderby_array = explode(' ', $q['orderby']);
 372              $q['orderby'] = '';
 373  
 374              foreach ( $orderby_array as $i => $orderby ) {
 375                  // Only allow certain values for safety
 376                  if ( ! in_array($orderby, $allowed_keys) )
 377                      continue;
 378  
 379                  switch ( $orderby ) {
 380                      case 'id':
 381                          $orderby = "$wpdb->mp_mails.id";
 382                          break;
 383                      case 'rand':
 384                          $orderby = 'RAND()';
 385                          break;
 386                      case $q['meta_key']:
 387                      case 'meta_value':
 388                          $orderby = "$wpdb->mp_mailmeta.meta_value";
 389                          break;
 390                      case 'meta_value_num':
 391                          $orderby = "$wpdb->mp_mailmeta.meta_value+0";
 392                          break;
 393                      default:
 394                          $orderby = "$wpdb->mp_mails." . $orderby;
 395                  }
 396  
 397                  $q['orderby'] .= (($i == 0) ? '' : ',') . $orderby;
 398              }
 399  
 400              // append ASC or DESC at the end
 401              if ( !empty($q['orderby']))
 402                  $q['orderby'] .= " {$q['order']}";
 403  
 404              if ( empty($q['orderby']) )
 405                  $q['orderby'] = "$wpdb->mp_mails.sent ".$q['order'];
 406          }
 407  
 408          // mailmeta queries
 409          if ( ! empty($q['meta_key']) || ! empty($q['meta_value']) )
 410              $join .= " JOIN $wpdb->mp_mailmeta ON ($wpdb->mp_mails.id = $wpdb->mp_mailmeta.mp_mail_id) ";
 411          if ( ! empty($q['meta_key']) )
 412              $where .= $wpdb->prepare(" AND $wpdb->mp_mailmeta.meta_key = %s ", $q['meta_key']);
 413          if ( ! empty($q['meta_value']) ) {
 414              if ( empty($q['meta_compare']) || ! in_array($q['meta_compare'], array('=', '!=', '>', '>=', '<', '<=')) )
 415                  $q['meta_compare'] = '=';
 416  
 417              $where .= $wpdb->prepare("AND $wpdb->mp_mailmeta.meta_value {$q['meta_compare']} %s ", $q['meta_value']);
 418          }
 419  
 420          // Paging
 421          if ( empty($q['nopaging']) ) 
 422          {
 423              $page = absint($q['paged']);
 424              if ( empty($page) )
 425                  $page = 1;
 426  
 427              if ( empty($q['offset']) ) 
 428              {
 429                  $pgstrt = '';
 430                  $pgstrt = ($page - 1) * $q['mails_per_page'] . ', ';
 431                  $limits = 'LIMIT ' . $pgstrt . $q['mails_per_page'];
 432              }
 433              else 
 434              {
 435                  $q['offset'] = absint($q['offset']);
 436                  $pgstrt = $q['offset'] . ', ';
 437                  $limits = 'LIMIT ' . $pgstrt . $q['mails_per_page'];
 438              }
 439          }
 440  
 441          $orderby = $q['orderby'];
 442  
 443          if ( ! empty($groupby) )
 444              $groupby = 'GROUP BY ' . $groupby;
 445          if ( !empty( $orderby ) )
 446              $orderby = 'ORDER BY ' . $orderby;
 447          $found_rows = '';
 448          if ( !$q['no_found_rows'] && !empty($limits) )
 449              $found_rows = 'SQL_CALC_FOUND_ROWS';
 450  
 451          $this->request = " SELECT $found_rows $distinct $fields FROM $wpdb->mp_mails $join WHERE $wpdb->mp_mails.status = 'archived' $where $groupby $orderby $limits";
 452  
 453          $this->mails = $wpdb->get_results($this->request);
 454  
 455          $this->mail_count = count($this->mails);
 456  
 457          if ( $this->mail_count > 0 ) $this->mail = $this->mails[0];
 458  
 459          return $this->mails;
 460      }
 461  
 462  	function have_mails() 
 463      {
 464          if ( $this->current_mail + 1 < $this->mail_count ) return true;
 465  
 466          if ( $this->current_mail + 1 == $this->mail_count && $this->mail_count > 0 ) 
 467              $this->rewind_mails();
 468  
 469          $this->in_the_loop = false;
 470          return false;
 471      }
 472  
 473  	function rewind_mails() 
 474      {
 475          $this->current_mail = -1;
 476          if ( $this->mail_count > 0 ) $this->mail = $this->mails[0];
 477      }
 478  
 479  	function in_the_loop() 
 480      {
 481          return $this->in_the_loop;
 482      }
 483  
 484  	function the_mail() 
 485      {
 486          $this->in_the_loop = true;
 487          $this->next_mail();
 488      }
 489  
 490  	function next_mail() 
 491      {
 492          $this->current_mail++;
 493          $this->mail = $this->mails[$this->current_mail];
 494      }
 495  
 496  	function the_ID() 
 497      {
 498          echo $this->get_the_ID();
 499      }
 500  	function get_the_ID() 
 501      {
 502          return $this->mail->id;
 503      }
 504  
 505  	function the_subject($before = '', $after = '', $echo = true) 
 506      {
 507          $subject = $this->get_the_subject();
 508  
 509          if ( strlen($subject) == 0 ) return;
 510  
 511          $subject = $before . $subject . $after;
 512  
 513          if ( $echo ) echo $subject;
 514          else         return $subject;
 515      }
 516  	function get_the_subject() 
 517      {
 518          $metas = MP_Mail_meta::get( $this->mail->id, '_MailPress_replacements' );
 519  
 520          $subject_display = $this->mail->subject;
 521          if ($metas) foreach($metas as $k => $v) $subject_display = str_replace($k, $v, $subject_display);
 522  
 523          return apply_filters( 'MailPress_the_subject', $subject_display, $this->mail->id );
 524      }
 525  
 526  	function the_content($format = 'html') 
 527      {
 528          echo $this->get_the_content($format);
 529      }
 530  	function get_the_content($format = 'html') 
 531      {
 532          if (empty($this->mail->html) || ($format == 'plaintext')) return apply_filters('the_content', $this->mail->plaintext);
 533          return $this->mail->html;
 534      }
 535  
 536  	function the_date( $d = '' )
 537      {
 538          echo apply_filters('the_date', $this->get_the_date( $d, true ), $d);
 539      }
 540  	function get_the_date( $d = '', $translate = false )
 541      {
 542          if ( '' == $d ) $d = get_option('date_format');
 543          return mysql2date($d, $this->mail->sent, $translate);
 544      }
 545  
 546  	function the_time( $d = '' ) 
 547      {
 548          echo apply_filters('the_time', $this->get_the_time( $d, true ), $d);
 549      }
 550  	function get_the_time( $d = '', $translate = false ) 
 551      {
 552          if ( '' == $d ) $d = get_option('time_format');
 553          return mysql2date($d, $this->mail->sent, $translate);
 554      }
 555  
 556  	function the_Theme() 
 557      {
 558          echo $this->get_the_Theme();
 559      }
 560  	function get_the_Theme()
 561      {
 562          return $this->mail->theme;
 563      }
 564  
 565  	function the_Template() 
 566      {
 567          echo $this->get_the_Template();
 568      }
 569  	function get_the_Template()
 570      {
 571          return $this->mail->template;
 572      }
 573  
 574  	function the_permalink() 
 575      {
 576          echo $this->get_the_permalink();
 577      }
 578  	function get_the_permalink($action = 'view', $key = 1)
 579      {
 580          return MP_::url(  MP_Action_url , array('action' => 'view', 'id' => $this->mail->id, 'key' => '0'));
 581      }
 582  
 583  	function get_mp_query_var($var) 
 584      {
 585          return $this->get($var);
 586      }
 587  
 588  	function set_query_var($var, $value) 
 589      {
 590          return $this->set($var, $value);
 591      }
 592  }


Generated: Thu Apr 28 18:38:52 2016 Cross-referenced by PHPXref 0.7.1