从WP_List_Table代码处理Wordpress中的搜索

时间:2014-06-12 18:13:11

标签: php wordpress wordpress-plugin

我需要使用WP_List_Table添加对搜索或过滤项目的支持我阅读并且不知道如何完成此操作。我已经通过此代码添加了该框:

function ft_list()
{
    echo '</pre><div class="wrap"><h2>' . __('Frequent Traveler List') . '</h2>';
    $ftList = new FT_WP_Table();
    $ftList->search_box('search', 'search_id');
    echo '</div>';
}

这就是我的prepare_items()函数的外观:

public function prepare_items()
{
    $searchcol = array(
        'firstname',
        'lastname',
        'foid',
        'no_frequent',
        'create_time'
    );

    $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->firstname ? "<em>{$no_title}</em>" : $post->firstname;
        $posts[$key]->firstname = "<a title='{$permalink} {$title}' href='{$link}'>{$title}</a>";
    }
    $this->items = $posts_array;
}

我应该在哪里添加代码以根据搜索参数过滤项目?

1 个答案:

答案 0 :(得分:6)

查看扩展WP_List_Table的其他类我发现它们使用类似

的内容
$search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : false;

并将其传递给prepare_items()方法。

在我的测试插件中,我做了这个(见Percent in wpdb->prepare

$search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : false;
$do_search = ( $search ) ? $wpdb->prepare(" AND post_content LIKE '%%%s%%' ", $search ) : ''; 
$sql_results = $wpdb->get_results("
        SELECT $sql_select
            FROM $wpdb->posts
        WHERE post_status = 'publish'
        $do_search
        ORDER BY $this->orderby $this->order "
);

我在display_tablenav()方法中添加了:

<form action="" method="GET">
    <?php 
    $this->search_box( __( 'Search' ), 'search-box-id' ); 
    ?>
    <input type="hidden" name="page" value="<?= esc_attr($_REQUEST['page']) ?>"/>
</form>

我还没有创建任何search_box()方法,让父类渲染它。