File "model.php"
Full Path: /www/wwwroot/shphe-en.com/wp-content/plugins/admin-columns-pro/classes/sortable/classes/model.php
File size: 12.1 KB
MIME-type: --
Charset: utf-8
<?php
/**
* Addon class
*
* @since 1.0
*
*/
abstract class CAC_Sortable_Model {
protected $storage_model;
protected $show_all_results;
protected $default_orderby;
abstract function get_sortables();
/**
* Constructor
*
* @since 1.0
*/
public function __construct( $storage_model ) {
$this->storage_model = $storage_model;
$this->show_all_results = $this->storage_model->get_general_option( 'show_all_results' );
// enable sorting per column
add_action( "cac/columns/registered/default/storage_key={$this->storage_model->key}", array( $this, 'enable_sorting' ) );
add_action( "cac/columns/registered/custom/storage_key={$this->storage_model->key}", array( $this, 'enable_sorting' ) );
// handle reset request
add_action( 'admin_init', array( $this, 'handle_reset' ) );
// Add reset button to admin settings
add_action( 'cac/settings/form_actions', array( $this, 'add_general_reset_button' ) );
}
/**
* Get sorting preference
*
* @since 1.0
*/
private function get_sorting_preference() {
$options = get_user_meta( get_current_user_id(), 'cpac_sorting_preference', true );
if ( empty( $options ) || ! is_array( $options ) || empty( $options[ $this->storage_model->key ] ) ) {
return false;
}
// when it's a WP default orderby we can skip as a preference
if ( $this->default_orderby == $options[ $this->storage_model->key ]['orderby'] ) {
return false;
}
return $options[ $this->storage_model->key ];
}
/**
* Add general reset button
*
* @since 1.0
*/
public function add_general_reset_button( $storage_model ) {
if ( $storage_model->key !== $this->storage_model->key ) {
return;
}
if ( ! ( $preference = $this->get_sorting_preference() ) ) {
return;
}
$sortby = isset( $preference['orderby'] ) ? $preference['orderby'] : '';
$url = add_query_arg( array(
'_cpac_nonce' => wp_create_nonce('restore-sorting'),
'cpac_key' => $storage_model->key,
'cpac_action' => 'restore_sorting_type'
), admin_url( 'options-general.php?page=codepress-admin-columns' ) );
$sortby_label = $sortby ? '<em style="color:#808080">' . sprintf ( __( ' by %s', 'codepress-admin-columns' ), $sortby ) . '</em>' : '';
echo "
<div class='form-reset'>
<a class='reset-column-type' href='{$url}'>" . __( 'Reset sorting preference', 'codepress-admin-columns' ) . "</a>" . $sortby_label . "
</div>";
}
/**
* Add reset button
*
* Which resets the sorting to it's default.
*
* @since 1.0
*/
public function add_reset_button() {
global $post_type_object, $pagenow;
if (
// corrrect page?
( $this->storage_model->page . '.php' !== $pagenow ) ||
// posttype?
( isset( $post_type_object->name ) && $post_type_object->name !== $this->storage_model->key )
) {
return false;
}
if ( ! ( $preference = $this->get_sorting_preference() ) ) {
return;
}
$sortby = isset( $preference['orderby'] ) ? $preference['orderby'] : '';
?>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('.tablenav.top .actions:last').append('');
jQuery('#cpac-reset-sorting').click( function(){
jQuery('#post-query-submit').trigger('mousedown'); // reset bulk actions
jQuery('<input>').attr({
type: 'hidden',
name: 'reset-sorting',
value: '<?php echo $this->storage_model->key; ?>'
}).appendTo(this);
jQuery(this).closest('form').submit();
});
});
</script>
<?php
}
/**
* Do sorting reset
*
* @since 1.0.3
* @param string Storage_model Key
*/
private function do_reset( $storage_model_key ) {
$options = get_user_meta( get_current_user_id(), 'cpac_sorting_preference', true );
if ( ! isset( $options[ $storage_model_key ] ) ) {
return false;
}
unset( $options[ $storage_model_key ] );
return update_user_meta( get_current_user_id(), 'cpac_sorting_preference', $options );
}
/**
* Handle reset request
*
* @since 1.0
*/
public function handle_reset() {
global $pagenow;
// On Admin settings page
if ( isset( $_GET['cpac_action'] ) && 'restore_sorting_type' == $_GET['cpac_action'] && !empty( $_GET['cpac_key'] ) && 'options-general.php' == $pagenow && !empty( $_GET['page'] ) && 'codepress-admin-columns' == $_GET['page'] ) {
// security check
if ( wp_verify_nonce( $_GET['_cpac_nonce'], 'restore-sorting' ) ) {
$result = $this->do_reset( $_GET['cpac_key'] );
if ( $result ) {
cpac_admin_message( "<strong>{$this->storage_model->label}</strong> " . __( 'sorting preference succesfully reset.', 'codepress-admin-columns' ), 'updated' );
}
}
}
// On Columns page
if ( $this->storage_model->page . '.php' == $pagenow && !empty( $_REQUEST['reset-sorting'] ) && $_REQUEST['reset-sorting'] == $this->storage_model->key ) {
// do a reset
$this->do_reset( $_REQUEST['reset-sorting'] );
// redirect back to admin
$admin_url = trailingslashit( admin_url() ) . $this->storage_model->page . '.php';
// for posts we need to add the type to the admin url
if ( 'post' == $this->storage_model->type ) {
$admin_url = $admin_url . '?post_type=' . $this->storage_model->key;
}
wp_safe_redirect( $admin_url );
exit;
}
}
/**
* Enable sorting
*
* @since 1.0
*/
public function enable_sorting( $columns ) {
foreach ( $columns as $column ) {
if ( ! in_array( $column->properties->type, $this->get_sortables() ) ) {
continue;
}
$column->set_properties( 'is_sortable', true );
$column->set_options( 'sort', 'on' );
}
}
/**
* Get column by orderby
*
* Returns column object based on which column heading is sorted.
*
* @since 1.0
*
* @param string $orderby
* @param string $type
* @return array Column
*/
protected function get_column_by_orderby( $orderby ) {
$column = false;
if ( $columns = $this->storage_model->columns ) {
foreach ( $columns as $_column ) {
if ( $orderby == $_column->get_sanitized_label() ) {
$column = $_column;
}
}
}
return apply_filters( 'cac/column/by_orderby', $column, $orderby, $this->storage_model->key );
}
/**
* Apply sorting preference
*
* @since 1.0
*
* @param array &$vars
* @param string $type
*/
protected function apply_sorting_preference( $vars ) {
$type = $this->storage_model->key;
// user has not sorted
if ( empty( $_GET['orderby'] ) ) {
// @todo: http://codex.wordpress.org/Function_Reference/update_post_meta#Character_Escaping
// Some charcters causes the output to be a broken serialized strings when using update_user_meta, needs work.
$options = get_user_meta( get_current_user_id(), 'cpac_sorting_preference', true );
// did the user sorted this column some other time?
if ( is_array( $options ) && ! empty( $options[ $type ] ) ) {
$vars['orderby'] = $options[ $type ]['orderby'];
$vars['order'] = $options[ $type ]['order'];
// to make sure we got correct pagination on the list table. ( normally this argument is passed on a manual sort request ). Only appplies to post metatype.
// @todo: could have a second look to see if there is more elegant solution.
if ( 'post' == $this->storage_model->type ) {
$per_page = (int) get_user_option( "edit_{$this->storage_model->key}_per_page" );
$vars['posts_per_archive_page'] = $per_page ? $per_page : 20 ;
}
}
}
// save the order preference
if ( ! empty( $vars['orderby'] ) ) {
$options = get_user_meta( get_current_user_id(), 'cpac_sorting_preference', true );
// in some rare case we can have a broken serialized string
if ( is_string( $options ) ) {
$options = array();
}
$options[ $type ] = array(
'orderby' => $vars['orderby'],
'order' => isset( $vars['order'] ) ? $vars['order'] : 'ASC'
);
update_user_meta( get_current_user_id(), 'cpac_sorting_preference', $options );
}
return $vars;
}
/**
* Prepare the value for being by sorting
*
* Removes tags and only get the first 20 chars and force lowercase.
*
* @since 1.0
*
* @param string $string
* @return string String
*/
protected function prepare_sort_string_value( $string ) {
return strtolower( substr( trim( strip_tags( $string ) ), 0, 20 ) );
}
/**
* Set post__in for use in WP_Query
*
* This will order the ID's asc or desc and set the appropriate filters.
*
* @since 1.0
*
* @param array &$vars
* @param array $sortposts
* @param const $sort_flags
* @return array Posts Variables
*/
protected function get_vars_post__in( $vars, $unsorted, $sort_flag = SORT_REGULAR ) {
/**
* Filter the post types for which Admin Columns is active
*
* @since 3.1
* @param int $sort_flag Used to modify the behavior of the asort() method.
* @param object $this CAC_Sortable_Model
*/
$sort_flag = apply_filters( 'cac/addon/sortable/sort_flag', $sort_flag, $this );
if ( $vars['order'] == 'asc' ) {
asort( $unsorted, $sort_flag );
}
else {
arsort( $unsorted, $sort_flag );
}
$vars['orderby'] = 'post__in';
$vars['post__in'] = array_keys( $unsorted );
return $vars;
}
/**
* Get post ID's
*
* @since 1.0.7
*
* @param array $args
* @return array Posts
*/
public function get_posts( $args = array() ) {
$defaults = array(
'numberposts' => -1,
'post_status' => array( 'any', 'trash' ),
'post_type' => $this->storage_model->post_type,
'fields' => 'ids',
'no_found_rows' => 1, // lowers our carbon footprint
);
$post_ids = (array) get_posts( array_merge( $defaults, $args ) );
return $post_ids;
}
/**
* Get posts sorted by taxonomy
*
* This will post ID's by the first term in the taxonomy
*
* @since 1.0.7
*
* @param string $post_type
* @param string $taxonomy
* @return array Posts
*/
protected function get_posts_sorted_by_taxonomy( $taxonomy = 'category' ) {
$args = array(
'suppress_filters' => false,
'_acp_taxonomy' => $taxonomy,
);
add_filter( 'posts_clauses', array( $this, 'get_posts_sorted_by_taxonomy_args' ), 10, 2 );
$posts = $this->get_posts( $args );
remove_filter( 'posts_clauses', array( $this, 'get_posts_sorted_by_taxonomy_args' ), 10, 2 );
return array_flip( $posts );
}
/**
* Setup clauses to sort by taxonomies
*
* @since 3.4
* @return array
*/
public function get_posts_sorted_by_taxonomy_args( $clauses, $query ) {
global $wpdb;
$clauses['join'] .= "
LEFT OUTER JOIN {$wpdb->term_relationships}
ON {$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy}
USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms}
USING (term_id)
";
$conditions[] = $wpdb->prepare('taxonomy = %s', $query->get( '_acp_taxonomy' ));
$conditions[] = $this->show_all_results ? ' OR taxonomy IS NULL' : '';
$clauses['where'] .= vsprintf( ' AND (%s%s)', $conditions );
$clauses['orderby'] = "{$wpdb->terms}.name " . $query->get( 'order' );
return $clauses;
}
/**
* Add sortable headings
*
* @since 1.0
*
* @param array $columns
* @return array Column name | Sanitized Label
*/
public function add_sortable_headings( $columns ) {
// get columns from storage model.
// columns that are active and have enabled sort will be added to the sortable headings.
if ( $_columns = $this->storage_model->columns ) {
foreach ( $_columns as $column ) {
if ( $column->properties->is_sortable ) {
if ( 'on' == $column->options->sort ) {
$columns[ $column->properties->name ] = $column->get_sanitized_label();
}
if ( 'off' == $column->options->sort ) {
unset( $columns[ $column->properties->name ] );
}
}
}
}
return $columns;
}
}