- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当前问题:我已经能够在仪表板管理区域内从我的 WP 的 sql 数据库成功创建各种表列表,以及使用 WP_LIST_TABLE 创建插件但是我遇到了困难关于如何使用短代码。通常我会添加如下内容:
add_shortcode('joblist', 'Job_List_Plugin');
但是这次它似乎不起作用。页面不生成表格,相反你只会看到你添加到页面的简码所以在这种情况下 [joblist]
问题:我如何将短代码元素添加到以下代码中,使我能够在前端页面上显示此表以供登录访问者查看?示例/片段将不胜感激。
if ( ! class_exists( 'WP_List_Table' ) ) {
require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
}
class Job_List extends WP_List_Table {
/** Class constructor */
public function __construct() {
parent::__construct( [
'singular' => __( 'Custom List', 'red' ), //singular name of the listed records
'plural' => __( 'Custom Lists', 'red' ), //plural name of the listed records
'ajax' => false //does this table support ajax?
] );
}
/**
* Retrieve members data from the database
*
* @param int $per_page
* @param int $page_number
*
* @return mixed
*/
public static function get_jobs( $per_page = 10, $page_number = 1 ) {
global $wpdb;
$query = "SELECT * FROM custom_table ORDER BY PrintOrder";
if( ! empty( $_REQUEST['s'] ) ){
$search = esc_sql( $_REQUEST['s'] );
$query .= " WHERE Description LIKE '%{$search}%'";
}
if ( ! empty( $_REQUEST['orderby'] ) ) {
$query .= ' ORDER BY ' . esc_sql( $_REQUEST['orderby'] );
$query .= ! empty( $_REQUEST['order'] ) ? ' ' . esc_sql( $_REQUEST['order'] ) : ' ASC';
}
$query .= " LIMIT $per_page";
$query .= ' OFFSET ' . ( $page_number - 1 ) * $per_page;
$result = $wpdb->get_results( $query, 'ARRAY_A' );
return $result;
}
/**
* Returns the count of records in the database.
*
* @return null|string
*/
public static function record_count() {
global $wpdb;
$query = "SELECT COUNT(*) FROM custom_table";
if( ! empty( $_REQUEST['s'] ) ){
$search = esc_sql( $_REQUEST['s'] );
$query .= " WHERE Description LIKE '%{$search}%'";
}
return $wpdb->get_var( $query );
}
/** Text displayed when no member data is available */
public function no_items() {
_e( 'There is nothing display at this time.', 'red' );
}
/**
* Render a column when no column specific method exist.
*
* @param array $item
* @param string $column_name
*
* @return mixed
*/
public function column_default( $item, $column_name ) {
switch ( $column_name ) {
case 'Description':
case 'Class':
case 'EmpName':
case 'StartTime':
return $item[ $column_name ];
default:
return print_r( $item, true ); //Show the whole array for troubleshooting purposes
}
}
/**
* Associative array of columns
*
* @return array
*/
function get_columns() {
$columns = [
'Description' => __( 'Classification', 'red' ),
'Class' => __( 'Class', 'red' ),
'EmpName' => __( 'Employer Name', 'red' ),
'StartTime' => __( 'Start Time', 'red' )
];
return $columns;
}
/**
* Columns to make sortable.
*
* @return array
*/
public function get_sortable_columns() {
$sortable_columns = array(
'Description' => array( 'Classification', true ),
'Class' => array ( 'Class', true)
);
return $sortable_columns;
}
/**
* Handles data query and filter, sorting, and pagination.
*/
public function prepare_items() {
$this->_column_headers = $this->get_column_info();
/** Process bulk action */
$this->process_bulk_action();
$per_page = $this->get_items_per_page( 'jobs_per_page', 7 );
$current_page = $this->get_pagenum();
$total_items = self::record_count();
$this->set_pagination_args( [
'total_items' => $total_items, //calculate the total number of items
'per_page' => $per_page //determine how many items to show on a page
] );
$this->items = self::get_jobs( $per_page, $current_page );
}
}
class Job_List_Plugin {
// class instance
static $instance;
// joblist WP_List_Table object
public $joblist_obj;
// class constructor
public function __construct() {
add_filter( 'set-screen-option', [ __CLASS__, 'set_screen' ], 10, 3 );
add_action( 'admin_menu', [ $this, 'plugin_menu' ] );
}
public static function set_screen( $status, $option, $value ) {
return $value;
}
public function plugin_menu() {
$hook = add_menu_page(
'Job List',
'Job List',
'manage_options',
'joblist_viewer',
[ $this, 'plugin_settings_page' ]
);
add_action( "load-$hook", [ $this, 'screen_option' ] );
}
/**
* Plugin page
*/
public function plugin_settings_page() {
?>
<style>
table {display: block;overflow-x: scroll;}
th {min-width:100px;font-size:10px;}
p.search-box {float:none;}
#post-body-content {width:98%;}
</style>
<h2>IBEW 353 Member Management Portal</h2>
<p>To locate a specific Member enter their Card Number in the search field provided.</p>
<div id="post-body-content">
<div class="meta-box-sortables ui-sortable">
<form method="post">
<input type="hidden" name="page" value="joblist_viewer" />
<?php
$this->joblist_obj->prepare_items();
$this->joblist_obj->search_box('Search', 'search');
$this->joblist_obj->display(); ?>
</form>
</div>
</div>
<br class="clear">
<?php
}
/**
* Screen options
*/
public function screen_option() {
$option = 'per_page';
$args = [
'label' => 'Jobs Per Page:',
'default' => 5,
'option' => 'jobs_per_page'
];
add_screen_option( $option, $args );
$this->joblist_obj = new Job_List();
}
/** Singleton instance */
public static function get_instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
}
add_action( 'plugins_loaded', function () {
Job_List_Plugin::get_instance();
} );
更新在@Jared Chu 的帮助下,我取得了一些进展,但现在出现错误。但至少我看到简码开始起作用了。
这是我编辑的。
我添加的第 203 行(类构造)
// class constructor
public function __construct() {
add_filter( 'set-screen-option', [ __CLASS__, 'set_screen' ], 10, 3 );
add_action( 'admin_menu', [ $this, 'plugin_menu' ] );
add_shortcode('joblist', [ $this, 'plugin_settings_page' ] ); // Added shortcode as per suggestion from @Jared Chu
}
公共(public)函数“plugin_settings_page”包含这段代码
/**
* Plugin page
*/
public function plugin_settings_page() {
?>
<style>
table {display: block;overflow-x: scroll;}
th {min-width:100px;font-size:10px;}
p.search-box {float:none;}
#post-body-content {width:98%;}
</style>
<h2>IBEW 353 Member Management Portal</h2>
<p>To locate a specific Member enter their Card Number in the search field provided.</p>
<div id="post-body-content">
<div class="meta-box-sortables ui-sortable">
<form method="post">
<input type="hidden" name="page" value="joblist_viewer" />
<?php
$this->joblist_obj->prepare_items();
$this->joblist_obj->search_box('Search', 'search');
$this->joblist_obj->display(); ?>
</form>
</div>
</div>
<br class="clear">
<?php
}
然而,当我查看我将简码放入的页面时,出现以下错误:
fatal error :未捕获错误:在第 249 行的 C:\wamp64\www\dev1\wp-content\plugins\Job-List-Plugin\index.php 中调用成员函数 prepare_items() on null
最佳答案
我在尝试在前端显示 WP_List_Table 时遇到了这个问题。我已经有一个正确定义的短代码,并在类外的管理员中呈现了我的菜单页面。尽管如此,当我使用短代码在前端呈现我的列表时还是遇到了这个错误。
经过两天的研究和谷歌搜索,我终于弄明白了。我需要额外的类才能在前端工作。我的猜测是这些类包含在 wp-admin 模式中但不包含在前端模式中,所以这就是为什么我们需要在我们的子类中要求它们。
我在这里找到了我的答案,有人问我一些不相关的问题,但有我需要的正确代码:https://wordpress.stackexchange.com/questions/350839/wp-list-table-in-frontend-how-to-style-with-bootstrap4
这些是您需要包含的类和文件:
require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
require_once(ABSPATH . 'wp-admin/includes/screen.php');
require_once(ABSPATH . 'wp-admin/includes/class-wp-screen.php');
require_once(ABSPATH . 'wp-admin/includes/template.php');
虽然这个问题已经有了答案,但如果有人遇到同样的问题,我会在这里发布。
编辑:忘记添加我如何在前端显示表格。我只是在需要呈现表格的页面模板中创建该类的新实例。像这样:
<main id="dashboard content">
<?php
$list = new LB_WP_Table();
?>
</main>
我使用此答案中的代码作为起点:https://stackoverflow.com/a/18933069
这是我目前的完整代码:
if( !class_exists( 'WP_List_Table' ) )
require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
require_once(ABSPATH . 'wp-admin/includes/screen.php');
require_once(ABSPATH . 'wp-admin/includes/class-wp-screen.php');
require_once(ABSPATH . 'wp-admin/includes/template.php');
class LB_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
) );
add_filter( 'get_list_instance', [$this, 'get_instance']);
add_shortcode('render_list', array($this, 'render_list_table'));
$this->set_order();
$this->set_orderby();
$this->prepare_items();
$this->display();
}
public function get_instance(){
return $this;
}
public function render_list_table(){
$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();
}
} // class
if (!is_admin()){ // Only do this in frontend
$list = new LB_WP_Table();
}
add_action('admin_menu', function()
{
add_menu_page(
'TE',
'<span style="color:#e57300;">Table Example</span>',
'edit_pages',
'table-example',
function() {
echo '<div class="wrap">';
screen_icon('edit');
echo '<h2>Table Example</h2>';
new LB_WP_Table();
echo '</div>';
},
'http://sstatic.net/stackexchange/img/favicon.ico',
1 // create before Dashboard menu item
);
});
关于php - 如何在前端页面上显示 WP_List_Tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45428581/
当前问题:我已经能够在仪表板管理区域内从我的 WP 的 sql 数据库成功创建各种表列表,以及使用 WP_LIST_TABLE 创建插件但是我遇到了困难关于如何使用短代码。通常我会添加如下内容: a
我对 OOP 并不完全熟悉,但我了解基础知识。我正在创建一个 Wordpress 插件,需要在插件页面上创建一个 (html) 表格。我读到在 WP 3.1 中有一个名为 WP_List_Table
我正在开发一个 WordPress 插件,该插件的一部分需要扩展 WP_List_Table 并将在该表中选中的任何项目存储到一个选项中。我已经设法弄清楚如何正确设置和显示所需的表格,但我该如何处理存
我在我的插件中使用wp_list_table类,我正在获取数据并使用wp_list_table在管理端显示它。但是一列有太多大数据并且它的长度太长,看起来不太好。所以有没有增加列长度的方法,我尝试使用
我在我的插件中使用wp_list_table类,我正在获取数据并使用wp_list_table在管理端显示它。但是一列有太多大数据并且它的长度太长,看起来不太好。所以有没有增加列长度的方法,我尝试使用
我使用 WordPress 插件中的 WP_List_Table 类创建了一个表。它基本上从数据库中输出一些信息。 Id 列在表格内占用了太多空间,我正在尝试减小宽度。有没有办法在 PHP 中执行此操
我正在使用 WP_List_Table 在 WordPress 插件中设置批量操作。我想允许的唯一批量操作是删除。我有一个链接可以删除通过 生成的随机数的项目 wp_create_nonce( 'de
我扩展类WP_List_Table显示自定义数据库表的列表记录。列表是成功的,但我对如何实现下拉过滤器以根据其类别过滤我的自定义数据库表记录感到生气。 请分享任何代码以添加下拉过滤器来过滤我的自定义数
WordPress 插件开发人员使用 WP_List_Table 类在管理面板中构建 HTML 表格。 但是,WordPress 官方文档在 here 中有以下注释. This class's acc
我需要添加对使用 WP_List_Table 搜索或过滤项目的支持 我读过但不知道如何完成这项工作。我已经通过这段代码添加了盒子: function ft_list() { echo '' .
您好,我正在编写一个插件,通过扩展 wordpress wp_list_table 类,我在其中显示了数据库中的各种条目。为了在每一行中显示一些操作链接,我按以下方式使用了此功能。 function
我在类中使用 wp_list_table 时遇到了一个 fatal error ,总的来说,我在类中扩展了 wordpress wp_list_table,然后当我尝试从它实例化一个对象时将它包含到我
我是一名优秀的程序员,十分优秀!