File: D:/HostingSpaces/ERijn/knijft.eu/wwwroot/wp-content/plugins/wysija-newsletters/models/wp_posts.php
<?php
defined('WYSIJA') or die('Restricted access');
class WYSIJA_model_wp_posts extends WYSIJA_model {
var $pk = 'ID';
var $tableWP = true;
var $table_name = 'posts';
var $columns = array(
'ID' => array(
'req' => true,
'type' => 'integer'
),
'post_author' => array('type' => 'integer'),
'post_date' => array(),
'post_date_gmt' => array(),
'post_content' => array(),
'post_title' => array(),
'post_excerpt' => array(),
'post_status' => array(),
'comment_status' => array(),
'ping_status' => array(),
'post_password' => array(),
'post_name' => array(),
'to_ping' => array(),
'pinged' => array(),
'post_modified' => array(),
'post_modified_gmt' => array(),
'post_content_filtered' => array(),
'post_parent' => array('type' => 'integer'),
'guid' => array(),
'menu_order' => array('type' => 'integer'),
'post_type' => array(),
'post_mime_type' => array(),
'comment_count' => array('type' => 'integer'),
);
function __construct() {
parent::__construct();
$this->table_prefix = '';
}
function get_posts($args = array()) {
/**
* SELECT A.ID, A.post_title, A.post_content, A.post_date FROM `wp_posts` A
* LEFT JOIN `wp_term_relationships` B ON (A.ID = B.object_id)
* LEFT JOIN `wp_term_taxonomy` C ON (C.term_taxonomy_id = B.term_taxonomy_id)
* WHERE C.term_id IN (326) AND A.post_type IN ('post') AND A.post_status IN ('publish') ORDER BY post_date DESC LIMIT 0,10;
*
*/
$default_args = array(
'post_limit' => 10,
'offset' => 0,
'category' => null,
'not_category' => null,
'orderby' => 'post_date',
'order' => 'DESC',
'include' => null,
'exclude' => null,
'meta_key' => null,
'meta_value' => null,
'post_type' => null,
'post_mime_type' => null,
'post_parent' => null,
'post_status' => 'publish',
'post_date' => null,
'is_search_query' => false,
'search' => null
);
$args = array_merge($default_args, $args);
// set categories
if(isset($args['category_ids']) && strlen(trim($args['category_ids'])) > 0) {
$args['category'] = explode(',', trim($args['category_ids']));
} else {
if(isset($args['post_category']) && (int) $args['post_category'] > 0) {
$args['category'] = (int) $args['post_category'];
}
}
if(isset($args['include_category_ids']) && !empty($args['include_category_ids'])) {
$args['category'] = $args['include_category_ids'];
}
if(isset($args['exclude_category_ids']) && !empty($args['exclude_category_ids'])) {
$args['not_category'] = $args['exclude_category_ids'];
}
// default selected fields
$post_fields = array(
'A.ID',
'A.post_title',
'A.post_content',
'A.post_excerpt',
'A.post_author',
'A.post_type',
'A.post_status'
);
$additional_post_fields = array(
'post_date',
'post_date_gmt',
'comment_status',
'ping_status',
'post_name',
'to_ping',
'pinged',
'post_modified',
'post_modified_gmt',
'post_content_filtered',
'post_parent',
'guid',
'menu_order',
'post_mime_type',
'comment_count'
);
// look for manual fields to select
if(isset($args['post_fields']) && is_array($args['post_fields']) && !empty($args['post_fields'])) {
$extra_post_fields = array_values(
array_intersect(
$additional_post_fields,
array_map('esc_sql', $args['post_fields'])
)
);
// merge both fields selection
$post_fields = array_merge(array('A.ID'), $extra_post_fields);
}
$query = sprintf('SELECT DISTINCT %s FROM `[wp]' . $this->table_name . '` A ', join(', ', $post_fields));
if($args['is_search_query'] === true) {
$count_query = 'SELECT COUNT(DISTINCT A.ID) as total FROM `[wp]' . $this->table_name . '` A ';
}
// search by category
if((isset($args['category']) && !empty($args['category'])) || (isset($args['not_category']) && !empty($args['not_category']))) {
$query_joins = 'JOIN `[wp]term_relationships` B ON (A.ID = B.object_id) ';
$query_joins .= 'JOIN `[wp]term_taxonomy` C ON (C.term_taxonomy_id = B.term_taxonomy_id) ';
$query .= $query_joins;
if($args['is_search_query'] === true) {
$count_query .= $query_joins;
}
}
$conditions = array();
if(isset($args['include']) && $args['include'] !== null) {
$conditions[] = array(
'col' => 'A.ID',
'sign' => 'IN',
'val' => $args['include'],
'cast' => 'int'
);
} else {
foreach ($args as $type => $value) {
if(!$value) continue;
switch ($type) {
case 'category':
$conditions[] = array(
'col' => 'C.term_id',
'sign' => 'IN',
'val' => $value,
'cast' => 'int'
);
break;
case 'not_category':
$conditions[] = array(
'col' => 'C.term_id',
'sign' => 'NOT IN',
'val' => $value,
'cast' => 'int'
);
break;
case 'include':
$conditions[] = array(
'col' => 'A.ID',
'sign' => 'IN',
'val' => $value,
'cast' => 'int'
);
break;
case 'exclude':
$conditions[] = array(
'col' => 'A.ID',
'sign' => 'NOT IN',
'val' => $value,
'cast' => 'int'
);
break;
case 'cpt': // this is for backwards compatibility's sake
case 'post_type':
$conditions[] = array(
'col' => 'A.post_type',
'sign' => 'IN',
'val' => $value
);
break;
case 'post_status':
$conditions[] = array(
'col' => 'A.post_status',
'sign' => 'IN',
'val' => $value
);
break;
case 'post_date':
// apply timezone to date value
$helper_toolbox = WYSIJA::get('toolbox', 'helper');
$value = $helper_toolbox->time_tzed($value);
if($value !== '') {
$conditions[] = array(
'col' => 'A.post_date',
'sign' => '>',
'val' => $value
);
}
break;
case 'search':
$conditions[] = array(
'col' => 'A.post_title',
'sign' => 'LIKE',
'val' => '%' . $value . '%'
);
break;
}
}
}
// set static conditions for post statuses (we don't want drafts and such to appear in search results)
if($args['include'] === null) {
$conditions[] = array(
'col' => 'A.post_status',
'sign' => 'NOT IN',
'val' => array(
'auto-draft',
'inherit'
)
);
}
// where conditions
if(!empty($conditions)) {
$query_conditions = $this->build_conditions($conditions);
$query .= $query_conditions;
if($args['is_search_query'] === true) {
$count_query .= $query_conditions;
}
}
// order by
if(isset($args['orderby'])) {
$query .= ' ORDER BY ' . $args['orderby'];
if(isset($args['sort_by'])) {
$query .= ' ' . (($args['sort_by'] === 'newest') ? 'DESC' : 'ASC');
} else {
if(isset($args['order'])) {
$query .= ' ' . $args['order'];
}
}
}
// set limit (only if we are not requesting posts based on their id)
if(array_key_exists('include', $args) && $args['include'] === null) {
$query_offset = (isset($args['query_offset']) ? (int) $args['query_offset'] : 0);
$query_limit = ((isset($args['post_limit']) && (int) $args['post_limit'] > 0) ? (int) $args['post_limit'] : 10);
$query .= sprintf(' LIMIT %d,%d', $query_offset, $query_limit);
}
if($args['is_search_query'] === true) {
return array(
'rows' => $this->query('get_res', $query),
'count' => $this->query('get_row', $count_query)
);
} else {
return $this->query('get_res', $query);
}
}
function build_conditions($conditions) {
$query = '';
$i = 0;
foreach ($conditions as $key => $data) {
if($i > 0) $query .= ' AND ';
$query .= $data['col'] . ' ';
$value = $data['val'];
switch ($data['sign']) {
case 'IN':
case 'NOT IN':
$values = '';
if(is_array($value)) {
if(array_key_exists('cast', $data) && $data['cast'] === 'int') {
$count = count($value);
for ($j = 0; $j < $count; $j++) {
if($value[$j] === null) continue;
$value[$j] = intval($value[$j]);
}
$values = join(', ', $value);
} else {
$values = "'" . join("', '", $value) . "'";
}
$query .= $data['sign'] . ' (' . $values . ')';
} else {
if(strpos($value, ',') === false) {
// single value
if(array_key_exists('cast', $data) && $data['cast'] === 'int') {
$query .= '= ' . (int) $value;
} else {
$query .= '= "' . $value . '"';
}
} else {
// multiple values
$values = "'" . join("','", explode(',', $value)) . "'";
$query .= $data['sign'] . ' (' . $values . ')';
}
}
break;
case 'LIKE':
$query .= ' LIKE "' . $value . '"';
break;
default:
$sign = '=';
if(isset($data['sign'])) $sign = $data['sign'];
if(array_key_exists('cast', $data) && $data['cast'] === 'int') {
$query .= $sign . (int) $value . " ";
} else {
$query .= $sign . "'" . $value . "' ";
}
}
$i++;
}
if($query === '') {
return '';
} else {
return 'WHERE ' . $query;
}
}
}