过滤wp_list_table结果只显示Pages

时间:2015-03-10 12:44:04

标签: php wordpress function

我目前正在自定义管理页面中显示帖子/页面列表。我希望只显示Pages和帖子,其方式与wordpress当前完全相同。

我认为目前它正在获取所有sql结果而不仅仅是某些帖子类型。

if( is_admin() && !class_exists( 'WP_List_Table' ) )
require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );

class blav_wp_table extends WP_List_Table
{
private $order;
private $orderby;
private $posts_per_page = 5;

public function __construct()
{
    parent :: __construct( array(
        'singular' => 'table example',
        'plural'   => 'table examples',
        'ajax'     => true
    ) );
    $this->set_order();
    $this->set_orderby();
    $this->prepare_items();
    $this->display();
}

private function get_sql_results()
{
    global $wpdb;
    $args = array( 'ID', 'post_title', 'post_date', 'post_content', 'post_type' );
    $sql_select = implode( ', ', $args );
    $sql_results = $wpdb->get_results("
            SELECT $sql_select
                FROM $wpdb->posts
            WHERE post_status = 'publish'
            ORDER BY $this->orderby $this->order "
    );
    return $sql_results;
}

public function set_order()
{
    $order = 'DESC';
    if ( isset( $_GET['order'] ) AND $_GET['order'] )
        $order = $_GET['order'];
    $this->order = esc_sql( $order );
}

public function set_orderby()
{
    $orderby = 'post_date';
    if ( isset( $_GET['orderby'] ) AND $_GET['orderby'] )
        $orderby = $_GET['orderby'];
    $this->orderby = esc_sql( $orderby );
}

/**
 * @see WP_List_Table::ajax_user_can()
 */
public function ajax_user_can() 
{
    return current_user_can( 'edit_posts' );
}

/**
 * @see WP_List_Table::no_items()
 */
public function no_items() 
{
    _e( 'No posts found.' );
}

/**
 * @see WP_List_Table::get_views()
 */
public function get_views()
{
    return array();
} 

/**
 * @see WP_List_Table::get_columns()
 */
public function get_columns()
{
    $columns = array(
        'ID'         => __( 'ID' ),
        'post_title' => __( 'Title' ),
        'post_date'  => __( 'Date' ),
        'post_type'  => __( 'Type' )
    );
    return $columns;        
}

/**
 * @see WP_List_Table::get_sortable_columns()
 */
public function get_sortable_columns()
{
    $sortable = array(
        'ID'         => array( 'ID', true ),
        'post_title' => array( 'post_title', true ),
        'post_date'  => array( 'post_date', true )
    );
    return $sortable;
}

/**
 * Prepare data for display
 * @see WP_List_Table::prepare_items()
 */
public function prepare_items()
{
    $columns  = $this->get_columns();
    $hidden   = array();
    $sortable = $this->get_sortable_columns();
    $this->_column_headers = array( 
        $columns,
        $hidden,
        $sortable 
    );

    // SQL results
    $posts = $this->get_sql_results();
    empty( $posts ) AND $posts = array();

    # >>>> Pagination
    $per_page     = $this->posts_per_page;
    $current_page = $this->get_pagenum();
    $total_items  = count( $posts );
    $this->set_pagination_args( array (
        'total_items' => $total_items,
        'per_page'    => $per_page,
        'total_pages' => ceil( $total_items / $per_page )
    ) );
    $last_post = $current_page * $per_page;
    $first_post = $last_post - $per_page + 1;
    $last_post > $total_items AND $last_post = $total_items;

    // Setup the range of keys/indizes that contain 
    // the posts on the currently displayed page(d).
    // Flip keys with values as the range outputs the range in the values.
    $range = array_flip( range( $first_post - 1, $last_post - 1, 1 ) );

    // Filter out the posts we're not displaying on the current page.
    $posts_array = array_intersect_key( $posts, $range );
    # <<<< Pagination

    // Prepare the data
    $permalink = __( 'Edit:' );
    foreach ( $posts_array as $key => $post )
    {
        $link     = get_edit_post_link( $post->ID );
        $no_title = __( 'No title set' );
        $title    = ! $post->post_title ? "<em>{$no_title}</em>" : $post->post_title;
        $posts[ $key ]->post_title = "<a title='{$permalink} {$title}' href='{$link}'>{$title}</a>";
    }
    $this->items = $posts_array;
}

/**
 * A single column
 */
public function column_default( $item, $column_name )
{
    return $item->$column_name;
}

/**
 * Override of table nav to avoid breaking with bulk actions & according nonce field
 */
public function display_tablenav( $which ) {
    ?>
    <div class="tablenav <?php echo esc_attr( $which ); ?>">
        <!-- 
        <div class="alignleft actions">
            <?php # $this->bulk_actions( $which ); ?>
        </div>
         -->
        <?php
        $this->extra_tablenav( $which );
        $this->pagination( $which );
        ?>
        <br class="clear" />
    </div>
    <?php
}

/**
 * Disables the views for 'side' context as there's not enough free space in the UI
 * Only displays them on screen/browser refresh. Else we'd have to do this via an AJAX DB update.
 * 
 * @see WP_List_Table::extra_tablenav()
 */
public function extra_tablenav( $which )
{
    global $wp_meta_boxes;
    $views = $this->get_views();
    if ( empty( $views ) )
        return;

    $this->views();
}
}

1 个答案:

答案 0 :(得分:0)

刚刚将AND $wpdb->posts.post_type = 'post'添加到get_sql_results