bottega/simple-membership/classes/class.swpm-protection-base.php

326 lines
10 KiB
PHP

<?php
abstract class SwpmProtectionBase {
protected $bitmap;
protected $posts;
protected $pages;
protected $comments;
protected $categories;
protected $attachments;
protected $custom_posts;
protected $details;
protected $options;
private function __construct() {
}
protected function init($level_id) {
global $wpdb;
$this->owning_level_id = $level_id;
$query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}swpm_membership_tbl WHERE "
. (is_numeric($level_id) ? 'id = %d' : 'md5(id) = %s' ), $level_id);
$result = $wpdb->get_row($query);
$this->bitmap = isset($result->permissions) ? $result->permissions : 0;
$this->posts = isset($result->post_list) ? (array) unserialize($result->post_list) : array();
$this->pages = isset($result->page_list) ? (array) unserialize($result->page_list) : array();
$this->comments = isset($result->comment_list) ? (array) unserialize($result->comment_list) : array();
$this->categories = isset($result->category_list) ? (array) unserialize($result->category_list) : array();
$this->attachments = isset($result->attachment_list) ? (array) unserialize($result->attachment_list) : array();
$this->custom_posts = isset($result->custom_post_list) ? (array) unserialize($result->custom_post_list) : array();
$this->options = isset($result->options) ? (array) unserialize($result->options) : array();
$this->disable_bookmark = isset($result->disable_bookmark_list) ? (array) unserialize($result->disable_bookmark_list) : array();
$this->details = (array) $result;
}
public function apply($ids, $type) {
$post_types = get_post_types(array('public' => true, '_builtin' => false));
if (in_array($type, $post_types)) {
$type = 'custom_post';
}
return $this->update_perms($ids, true, $type);
}
public function remove($ids, $type) {
$post_types = get_post_types(array('public' => true, '_builtin' => false));
if (in_array($type, $post_types)) {
$type = 'custom_post';
}
return $this->update_perms($ids, false, $type);
}
public function get_options() {
return $this->options;
}
public function get_posts() {
return $this->posts;
}
public function get_pages() {
return $this->pages;
}
public function get_comments() {
return $this->comments;
}
public function get_categories() {
return $this->categories;
}
public function get_attachments() {
return $this->attachments;
}
public function get_custom_posts() {
return $this->custom_posts;
}
public function is_bookmark_disabled($id) {
$posts = isset($this->disable_bookmark['posts']) ?
(array) $this->disable_bookmark['posts'] : array();
$pages = isset($this->disable_bookmark['pages']) ?
(array) $this->disable_bookmark['pages'] : array();
return in_array($id, $pages) || in_array($id, $posts);
}
public function in_posts($id) {
return (/* ($this->bitmap&4)===4) && */in_array($id, (array) $this->posts));
}
public function in_pages($id) {
return (/* ($this->bitmap&8)===8) && */ in_array($id, (array) $this->pages));
}
public function in_attachments($id) {
return (/* ($this->bitmap&16)===16) && */in_array($id, (array) $this->attachments));
}
public function in_custom_posts($id) {
return (/* ($this->bitmap&32)===32) && */ in_array($id, (array) $this->custom_posts));
}
public function in_comments($id) {
return (/* ($this->bitmap&2)===2) && */ in_array($id, (array) $this->comments));
}
public function in_categories($id) {
if (empty($this->categories))
return false;
return (/* ($this->bitmap&1)===1) && */ in_array($id, (array) $this->categories));
}
public function post_in_categories($post_id) {
if (empty($this->categories)){
return false;
}
$taxonomies = get_taxonomies(array('public' => true,'_builtin'=>false));
if (!is_array($taxonomies) || empty($taxonomies)) {
$taxonomies = 'category';
} else {
$taxonomies['category'] = 'category';
}
$terms = wp_get_post_terms( $post_id, $taxonomies, array('fields'=>'ids'));
if(!is_array($terms)){
return false;
}
foreach ($terms as $key=>$value){
if (in_array($value, $this->categories)) {return true;}
}
return false;
}
public function in_parent_categories($id) {
if (empty($this->categories)){
return false;
}
$taxonomies = get_taxonomies(array('public' => true,'_builtin'=>false));
if (!is_array($taxonomies) || empty($taxonomies)) {
$taxonomies = 'category';
} else {
$taxonomies['category'] = 'category';
}
$terms = get_term($id, $taxonomies);
if(!is_array($terms)){
return false;
}
foreach ($terms as $term){
if ($term->parent == 0) {continue;}
if (in_array($term->parent, $this->categories)) {return true;}
}
return false;
}
public function post_in_parent_categories($post_id) {
if (empty($this->categories)){
return false;
}
$taxonomies = get_taxonomies(array('public' => true,'_builtin'=>false));
if (!is_array($taxonomies) || empty($taxonomies)) {
$taxonomies = 'category';
} else {
$taxonomies['category'] = 'category';
}
$terms = wp_get_post_terms( $post_id, $taxonomies, array('fields'=>'all'));
if(!is_array($terms)){
return false;
}
foreach ($terms as $term){
if ($term->parent != 0 &&in_array($term->parent, $this->categories)) {
return true;
}
}
return false;
}
public function add_posts($ids) {
return $this->update_perms($ids, true, 'post');
}
public function add_pages($ids) {
return $this->update_perms($ids, true, 'page');
}
public function add_attachments($ids) {
return $this->update_perms($ids, true, 'attachment');
}
public function add_comments($ids) {
return $this->update_perms($ids, true, 'comment');
}
public function add_categories($ids) {
return $this->update_perms($ids, true, 'category');
}
public function add_custom_posts($ids) {
return $this->update_perms($ids, true, 'custom_post');
}
public function remove_posts($ids) {
return $this->update_perms($ids, false, 'post');
}
public function remove_pages($ids) {
return $this->update_perms($ids, false, 'page');
}
public function remove_attachments($ids) {
return $this->update_perms($ids, false, 'attachment');
}
public function remove_comments($ids) {
return $this->update_perms($ids, false, 'comment');
}
public function remove_categories($ids) {
return $this->update_perms($ids, false, 'category');
}
public function remove_custom_posts($ids) {
return $this->update_perms($ids, false, 'custom_post');
}
private function update_perms($ids, $set, $type) {
$list = null;
$index = '';
if (empty($ids)) {
return $this;
}
$ids = (array) $ids;
switch ($type) {
case 'page':
$list = $this->pages;
$index = 'page_list';
break;
case 'post':
$list = $this->posts;
$index = 'post_list';
break;
case 'attachment':
$list = $this->attachments;
$index = 'attachment_list';
break;
case 'comment':
$list = $this->comments;
$index = 'comment_list';
break;
case 'category':
$list = $this->categories;
$index = 'category_list';
break;
case 'custom_post':
$list = $this->custom_posts;
$index = 'custom_post_list';
break;
default:
break;
}
if (!empty($index)) {
if ($set) {
$list = array_merge($list, $ids);
$list = array_unique($list);
} else {
$list = array_diff($list, $ids);
}
switch ($type) {
case 'page':
$this->pages = $list;
break;
case 'post':
$this->posts = $list;
break;
case 'attachment':
$this->attachments = $list;
break;
case 'comment':
$this->comments = $list;
break;
case 'category':
$this->categories = $list;
break;
case 'custom_post':
$this->custom_posts = $list;
break;
default:
break;
}
$this->details[$index] = $list;
}
return $this;
}
public function save() {
global $wpdb;
$data = array();
$list_type = array('page_list', 'post_list', 'attachment_list',
'custom_post_list', 'comment_list', 'category_list');
foreach ($this->details as $key => $value) {
if ($key == 'id')
continue;
if (is_serialized($value) || !in_array($key, $list_type))
$data[$key] = $value;
else
$data[$key] = serialize($value);
}
$wpdb->update($wpdb->prefix . "swpm_membership_tbl", $data, array('id' => $this->owning_level_id));
}
public function get($key, $default = '') {
if (isset($this->details[$key])) {
return $this->details[$key];
}
return $default;
}
}