如何在wp_list_table上呈现批量编辑复选框

时间:2016-05-20 11:06:24

标签: php wordpress wpdb

我试图通过制作扩展类来使用wp_list_table。我有两个操作可以完成所提供的批量更新功能。但是,我不太清楚如何编写正确的case switch语句来设置结果复选框以根据所采取的操作应用任何数组操作...(请参阅我知道我需要做什么,但我不是&# 39;我完全知道怎么做。)

这是我必须使用的最小的相关代码:

  /**
   * Render the bulk edit checkbox
   *
   * @param array $item
   *
   * @return string
   */
  function column_cb( $item ) {
    return sprintf(
      '<input type="checkbox" name="bulk-reset[]" value="%s" />', $item['id']

    );
  }


  /**
   * Method for name column
   *
   * @param array $item an array of DB data
   *
   * @return string
   */
  function column_name( $item ) {

    $delete_nonce = wp_create_nonce( 'sp_delete_customer' );
    $reset_nonce = wp_create_nonce( 'sp_reset_payouts' );

    $title = '<strong>' . $item['name'] . '</strong>';

    $actions = [
      'delete' => sprintf( '<a href="?page=%s&action=%s&customer=%s&_wpnonce=%s">Delete</a>', esc_attr( $_REQUEST['page'] ), 'delete', absint( $item['id'] ), $delete_nonce ),

      'reset' => sprintf( '<a href="?page=%s&action=%s&customer=%s&_wpnonce=%s">Reset</a>', esc_attr( $_REQUEST['page'] ), 'reset', absint( $item['id'] ), $reset_nonce )

    ];

    return $title . $this->row_actions( $actions );
  }

  /**
   * Returns an associative array containing the bulk action
   *
   * @return array
   */
  public function get_bulk_actions() {
    $actions = array(
      'bulk-delete' => 'Delete',
      'bulk-reset' => 'Reset'
    );

    return $actions;
  }

最后一次回顾这个问题,我想我需要一个在name属性上调用的函数作为转义的php echo吗?那么该函数应该返回基于$_post['delete-*']的bulk-reset []或bulk-delete []吧???

由于仔细考虑了这一点,我试图将解决方案结合在一起,但无论出于什么原因,我所做的action_type功能都没有被调用:

  /**
   * Render the bulk edit checkbox
   *
   * @param array $item
   *
   * @return string
   */
  function column_cb( $item ) {

    global $action_type;

    return sprintf(
      '<input type="checkbox" name="'.$action_type.'" value="%s" />', $item['id']

    );
  }



  /**
   * Pick the Checkbox Value based on post Value
   *
   * 
   * @return string
   *
   */

  public function action_type() {

     if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'bulk-delete' )
         || ( isset( $_POST['action2'] ) && $_POST['action2'] == 'bulk-delete' )
    ) {
      $output = "bulk-delete[]";

     } else {
      $output = "bulk-reset[]";
     }
     return $output;

  }

编辑2:意识到它不会起作用,因为这会设置值post并且我需要在页面加载之前设置它...我想这意味着我需要让数组名称是通用的,post post处理如何处理数据...为了简单起见,我应该将编辑操作设置为与最终相同的复选框一样的批量删除数据集。

编辑3:我无法在edit2结束时执行建议,因为运行操作的代码部分取决于帖子的数组名称,并且在页面加载时设置了该数组名称。我不太清楚该怎么做。

2 个答案:

答案 0 :(得分:1)

在“类My_Example_List_Table扩展WP_List_Table”类中尝试这三个函数并根据您的要求进行修改

function column_id($item){
  $actions = array(
          /*  'edit'      => sprintf('<a href="?page=%s&action=%s&book=%s">Edit</a>',$_REQUEST['page'],'edit',$item['ID']),*/
     'delete' => sprintf('<a href="?page=%s&action=%s&id=%s">Delete</a>',$_REQUEST['page'],'delete',$item['id']),
        );
  return sprintf('%1$s %2$s', $item['id'], $this->row_actions($actions) );
}




function get_bulk_actions() {

  $actions = array(
    'delete'    => 'Delete'
  );
  return $actions;
}

function process_bulk_action(){

    global $wpdb;
    $table_name = $wpdb->prefix."tablename"; 

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

            $ids = isset($_REQUEST['id']) ? $_REQUEST['id'] : array();
            if (is_array($ids)) $ids = implode(',', $ids);

            if (!empty($ids)) {
                $wpdb->query("DELETE FROM $table_name WHERE id IN($ids)");
            }

        }
 }

答案 1 :(得分:0)

以下是我解决这个问题的方法:

  1. 将复选框数组值更改(或不更改)为通用。我选择了myCheckboxes[]
  2. 此部分未在上面的答案中显示,但执行更新或删除查询的代码部分是数据设置的位置...我看到更改值允许我的复选框列应用于所有行动。 (我计划在解决相关问题后进一步重构代码,因此这不是整个代码片段(即,这不是复制/粘贴替换的下降,只是我如何解决这个问题的上下文)
  3. 以下是您可以看到的相关缺失底部部分已更改为与新复选框值匹配:

    // // If the delete bulk action is triggered
    if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'bulk-delete' )
         || ( isset( $_POST['action2'] ) && $_POST['action2'] == 'bulk-delete' )
    ) {
    
      $delete_ids = esc_sql( $_POST['my_CheckBoxes'] );
    
      // loop over the array of record IDs and delete them
      foreach ( $delete_ids as $id ) {
        self::delete_customer( $id );
      }
      wp_redirect( esc_url( add_query_arg() ) );
      exit;
    }