2012-02-14 4 views
2

저는 WordPress 플러그인에서 작업 중이며 해당 플러그인의 일부는 WP_List_Table을 확장하고 해당 테이블에서 선택된 항목을 옵션에 저장해야합니다. 필자는 필요한 테이블을 올바르게 설정하고 표시하는 방법을 알아 냈지만 선택한 옵션의 저장은 어떻게 처리합니까?플러그인 관리에서 WP_List_Table/handling 확인란 옵션 확장

여기에 내가 제대로 저장하지 수,

class TDBar_List_Table extends WP_List_Table { 

    // Reference parent constructor 
    function __construct() { 
     global $status, $page; 

     // Set defaults 
     parent::__construct(array(
      'singular' => 'theme', 
      'plural' => 'themes', 
      'ajax' => false 
     )); 
    } 

    // Set table classes 
    function get_table_classes() { 
     return array('widefat', 'wp-list-table', 'themes'); 
    } 

    // Setup default column 
    function column_default($item, $column_name) { 
     switch($column_name) { 
      case 'Title': 
      case 'URI': 
      case'Description': 
       return $item[$column_name]; 
      default: 
       return print_r($item, true); 
     } 
    } 

    // Displaying checkboxes! 
    function column_cb($item) { 
     return sprintf(
      '<input type="checkbox" name="%1$s" id="%2$s" value="checked" />', 
      //$this->_args['singular'], 
      $item['Stylesheet'] . '_status', 
      $item['Stylesheet'] . '_status' 
     ); 
    } 

    // Display theme title 
    function column_title($item) { 
     return sprintf(
      '<strong>%1$s</strong>', 
      $item['Title'] 
     ); 
    } 

    // Display theme preview 
    function column_preview($item) { 
     if (file_exists(get_theme_root() . '/' . $item['Stylesheet'] . '/screenshot.png')) { 
      $preview = get_theme_root_uri() . '/' . $item['Stylesheet'] . '/screenshot.png'; 
     } else { 
      $preview = ''; 
     } 
      return sprintf(
       '<a href="%1$s" class="thickbox" title="%2$s"><img src="%3$s" style="width: 150px;" /></a>', 
       $preview, 
       $item['Title'], 
       $preview 
      ); 
    } 

    // Display theme description 
    function column_description($item) { 
     if (isset($item['Version'])) { 
      $version = 'Version ' . $item['Version']; 
      if (isset($item['Author']) || isset($item['URI'])) 
       $version .= '&nbsp;|&nbsp;'; 
     } else { 
      $version = ''; 
     } 
     if (isset($item['Author'])) { 
      $author = 'By ' . $item['Author']; 
      if (isset($item['URI'])) 
       $author .= '&nbsp;|&nbsp;'; 
     } else { 
      $author = ''; 
     } 
     if (isset($item['URI'])) { 
      $uri = $item['URI']; 
     } else { 
      $uri = ''; 
     } 

     return sprintf(
      '<div class="theme-description"><p>%1$s</p></div><div class="second theme-version-author-uri">%2$s%3$s%4$s', 
      $item['Description'], 
      $version, 
      $author, 
      $uri 
     ); 
    } 

    // Setup columns 
    function get_columns() { 
     $columns = array(
      'cb' => '<input type="checkbox" />', 
      'title' => 'Theme', 
      'preview' => 'Preview', 
      'description' => 'Description' 
     ); 
     return $columns; 
    } 

    // Make title column sortable 
    function get_sortable_columns() { 
     $sortable_columns = array(
      'title' => array('Title', true) 
     ); 
     return $sortable_columns; 
    } 

    // Setup bulk actions 
    function get_bulk_actions() { 
     $actions = array(
      'update' => 'Update' 
     ); 
     return $actions; 
    } 

    // Handle bulk actions 
    function process_bulk_action() { 
     // Define our data source 
     if (defined('WP_ALLOW_MULTISITE') && WP_ALLOW_MULTISITE == true) { 
      $themes = get_allowed_themes(); 
     } else { 
      $themes = get_themes(); 
     } 

     if ('update' === $this->current_action()) { 
      foreach ($themes as $theme) { 
       if ($theme['Stylesheet'] . '_status' == 'checked') { 
        // Do stuff - here's the problem 
       } 
      } 
     } 
    } 

    // Handle data preparation 
    function prepare_items() { 

     // How many records per page? 
     $per_page = 10; 

     // Define column headers 
     $columns = $this->get_columns(); 
     $hidden = array(); 
     $sortable = $this->get_sortable_columns(); 

     // Build the array 
     $this->_column_headers = array($columns, $hidden, $sortable); 

     // Pass off bulk action 
     $this->process_bulk_action(); 

     // Define our data source 
     if (defined('WP_ALLOW_MULTISITE') && WP_ALLOW_MULTISITE == true) { 
      $themes = get_allowed_themes(); 
     } else { 
      $themes = get_themes(); 
     } 

     // Handle sorting 
     function usort_reorder($a,$b) { 
      $orderby = (!empty($_REQUEST['orderby'])) ? $_REQUEST['orderby'] : 'Title'; 
      $order = (!empty($_REQUEST['order'])) ? $_REQUEST['order'] : 'asc'; 
      $result = strcmp($a[$orderby], $b[$orderby]); 
      return ($order === 'asc') ? $result : -$result; 
     } 
     usort($themes, 'usort_reorder'); 

     //MAIN STUFF HERE 
     //for ($i = 0; i < count($themes); $i++) { 

     //} 

     // Figure out the current page and how many items there are 
     $current_page = $this->get_pagenum(); 
     $total_items = count($themes); 

     // Only show the current page 
     $themes = array_slice($themes,(($current_page-1)*$per_page),$per_page); 

     // Display sorted data 
     $this->items = $themes; 

     // Register pagination options 
     $this->set_pagination_args(array(
      'total_items' => $total_items, 
      'per_page' => $per_page, 
      'total_pages' => ceil($total_items/$per_page) 
     )); 
    } 
} 

문제는 ... 내가 지금까지있어거야. 원하는 행을 선택하고 저장을 클릭하면 리셋됩니다.

답변

3

테이블 목록의 체크 박스에 대해 이야기하고 있다고 가정합니다. 따라서 대량 작업을 처리하는 방법이 될 것입니다.

클래스에 두 개의 새 메소드를 추가하고 prepare_items 메소드에서 초기화해야합니다. 내 플러그인 중 하나에서 아래 코드를 사용하여 삭제 또는 내보내기를 수행 할 수 있지만 업데이트를 쉽게 실행할 수 있습니다. 이제

/** 
* Define our bulk actions 
* 
* @since 1.2 
* @returns array() $actions Bulk actions 
*/ 
function get_bulk_actions() { 
    $actions = array(
     'delete' => __('Delete' , 'visual-form-builder'), 
     'export-all' => __('Export All' , 'visual-form-builder'), 
     'export-selected' => __('Export Selected' , 'visual-form-builder') 
    ); 

    return $actions; 
} 

/** 
* Process our bulk actions 
* 
* @since 1.2 
*/ 
function process_bulk_action() {   
    $entry_id = (is_array($_REQUEST['entry'])) ? $_REQUEST['entry'] : array($_REQUEST['entry']); 

    if ('delete' === $this->current_action()) { 
     global $wpdb; 

     foreach ($entry_id as $id) { 
      $id = absint($id); 
      $wpdb->query("DELETE FROM $this->entries_table_name WHERE entries_id = $id"); 
     } 
    } 
} 

,과 같이 prepare_items 내부에이 방법을()를 호출 :

function prepare_items() { 
     //Do other stuff in here 

     /* Handle our bulk actions */ 
     $this->process_bulk_action(); 
} 

훨씬 쉽게 WP_List_Table 클래스를 파악하게 Custom List Table Example라는 환상적인 도우미 플러그인이있다.

+0

도움이되었습니다. 하나의 설명 : 다른 항목 작성 전에'process_bulk_actions()'를 실행해야합니다. 그렇지 않으면 delete와 같은 동작이 효과가없는 것으로 보입니다. – clifgriffin

+0

@clifgriffin 들으십시오! – Michelle