2010-10-25 02:12:41 +02:00
|
|
|
<?php
|
|
|
|
/**
|
2015-10-17 17:13:25 +02:00
|
|
|
* List Table API: WP_Posts_List_Table class
|
2010-10-25 02:12:41 +02:00
|
|
|
*
|
|
|
|
* @package WordPress
|
2015-10-17 17:13:25 +02:00
|
|
|
* @subpackage Administration
|
|
|
|
* @since 3.1.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Core class used to implement displaying posts in a list table.
|
|
|
|
*
|
2010-10-25 06:04:18 +02:00
|
|
|
* @since 3.1.0
|
2011-01-16 22:47:24 +01:00
|
|
|
* @access private
|
2015-10-17 17:13:25 +02:00
|
|
|
*
|
|
|
|
* @see WP_List_Table
|
2010-10-25 02:12:41 +02:00
|
|
|
*/
|
2010-11-04 09:07:03 +01:00
|
|
|
class WP_Posts_List_Table extends WP_List_Table {
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
/**
|
2015-10-16 20:25:25 +02:00
|
|
|
* Whether the items should be displayed hierarchically or linearly.
|
2010-10-25 02:12:41 +02:00
|
|
|
*
|
|
|
|
* @since 3.1.0
|
|
|
|
* @var bool
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
protected $hierarchical_display;
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
/**
|
2015-10-16 20:25:25 +02:00
|
|
|
* Holds the number of pending comments for each post.
|
2010-10-25 02:12:41 +02:00
|
|
|
*
|
|
|
|
* @since 3.1.0
|
2015-10-16 20:25:25 +02:00
|
|
|
* @var array
|
2010-10-25 02:12:41 +02:00
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
protected $comment_pending_count;
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
/**
|
2015-10-16 20:25:25 +02:00
|
|
|
* Holds the number of posts for this user.
|
2010-10-25 02:12:41 +02:00
|
|
|
*
|
|
|
|
* @since 3.1.0
|
2010-10-27 10:27:45 +02:00
|
|
|
* @var int
|
2010-10-25 02:12:41 +02:00
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
private $user_posts_count;
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2010-10-27 10:27:45 +02:00
|
|
|
/**
|
|
|
|
* Holds the number of posts which are sticky.
|
|
|
|
*
|
|
|
|
* @since 3.1.0
|
|
|
|
* @var int
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
private $sticky_posts_count = 0;
|
2010-10-27 10:27:45 +02:00
|
|
|
|
2015-01-12 17:22:22 +01:00
|
|
|
private $is_trash;
|
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
/**
|
2015-07-13 19:49:25 +02:00
|
|
|
* Current level for output.
|
|
|
|
*
|
2015-06-12 22:18:24 +02:00
|
|
|
* @since 4.3.0
|
|
|
|
* @var int
|
|
|
|
*/
|
|
|
|
protected $current_level = 0;
|
|
|
|
|
2014-08-10 04:18:17 +02:00
|
|
|
/**
|
|
|
|
* Constructor.
|
2014-09-04 17:23:16 +02:00
|
|
|
*
|
2014-08-10 04:18:17 +02:00
|
|
|
* @since 3.1.0
|
|
|
|
*
|
|
|
|
* @see WP_List_Table::__construct() for more information on default arguments.
|
|
|
|
*
|
2016-06-28 18:41:35 +02:00
|
|
|
* @global WP_Post_Type $post_type_object
|
2019-08-04 03:12:56 +02:00
|
|
|
* @global wpdb $wpdb WordPress database abstraction object.
|
2015-05-28 23:41:30 +02:00
|
|
|
*
|
2014-08-10 04:18:17 +02:00
|
|
|
* @param array $args An associative array of arguments.
|
2014-08-10 04:22:16 +02:00
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
public function __construct( $args = array() ) {
|
2011-11-06 22:14:27 +01:00
|
|
|
global $post_type_object, $wpdb;
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
parent::__construct(
|
|
|
|
array(
|
|
|
|
'plural' => 'posts',
|
|
|
|
'screen' => isset( $args['screen'] ) ? $args['screen'] : null,
|
|
|
|
)
|
|
|
|
);
|
2012-09-19 14:43:31 +02:00
|
|
|
|
2015-09-20 19:28:24 +02:00
|
|
|
$post_type = $this->screen->post_type;
|
2010-10-25 02:12:41 +02:00
|
|
|
$post_type_object = get_post_type_object( $post_type );
|
2015-09-26 08:51:26 +02:00
|
|
|
|
2021-05-03 15:57:04 +02:00
|
|
|
$exclude_states = get_post_stati(
|
2017-12-01 00:11:00 +01:00
|
|
|
array(
|
|
|
|
'show_in_admin_all_list' => false,
|
|
|
|
)
|
|
|
|
);
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2020-10-08 23:15:13 +02:00
|
|
|
$this->user_posts_count = (int) $wpdb->get_var(
|
|
|
|
$wpdb->prepare(
|
2021-05-03 15:57:04 +02:00
|
|
|
"SELECT COUNT( 1 )
|
|
|
|
FROM $wpdb->posts
|
|
|
|
WHERE post_type = %s
|
|
|
|
AND post_status NOT IN ( '" . implode( "','", $exclude_states ) . "' )
|
|
|
|
AND post_author = %d",
|
2020-10-08 23:15:13 +02:00
|
|
|
$post_type,
|
|
|
|
get_current_user_id()
|
2017-12-01 00:11:00 +01:00
|
|
|
)
|
|
|
|
);
|
2015-09-20 19:28:24 +02:00
|
|
|
|
2021-05-03 15:57:04 +02:00
|
|
|
if ( $this->user_posts_count
|
|
|
|
&& ! current_user_can( $post_type_object->cap->edit_others_posts )
|
|
|
|
&& empty( $_REQUEST['post_status'] ) && empty( $_REQUEST['all_posts'] )
|
|
|
|
&& empty( $_REQUEST['author'] ) && empty( $_REQUEST['show_sticky'] )
|
|
|
|
) {
|
2015-09-20 19:28:24 +02:00
|
|
|
$_GET['author'] = get_current_user_id();
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2019-07-01 14:52:01 +02:00
|
|
|
$sticky_posts = get_option( 'sticky_posts' );
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2019-07-01 14:52:01 +02:00
|
|
|
if ( 'post' === $post_type && $sticky_posts ) {
|
2021-05-03 15:57:04 +02:00
|
|
|
$sticky_posts = implode( ', ', array_map( 'absint', (array) $sticky_posts ) );
|
|
|
|
|
|
|
|
$this->sticky_posts_count = (int) $wpdb->get_var(
|
|
|
|
$wpdb->prepare(
|
|
|
|
"SELECT COUNT( 1 )
|
|
|
|
FROM $wpdb->posts
|
|
|
|
WHERE post_type = %s
|
|
|
|
AND post_status NOT IN ('trash', 'auto-draft')
|
|
|
|
AND ID IN ($sticky_posts)",
|
|
|
|
$post_type
|
|
|
|
)
|
|
|
|
);
|
2010-10-27 10:27:45 +02:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2015-03-11 21:46:27 +01:00
|
|
|
/**
|
|
|
|
* Sets whether the table layout should be hierarchical or not.
|
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*
|
|
|
|
* @param bool $display Whether the table layout should be hierarchical.
|
|
|
|
*/
|
|
|
|
public function set_hierarchical_display( $display ) {
|
|
|
|
$this->hierarchical_display = $display;
|
|
|
|
}
|
|
|
|
|
2015-05-29 22:17:26 +02:00
|
|
|
/**
|
|
|
|
* @return bool
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
public function ajax_user_can() {
|
2012-09-19 14:43:31 +02:00
|
|
|
return current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_posts );
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2015-05-28 23:41:30 +02:00
|
|
|
/**
|
2020-07-10 18:04:05 +02:00
|
|
|
* @global string $mode List table view mode.
|
2015-05-28 23:41:30 +02:00
|
|
|
* @global array $avail_post_stati
|
2019-08-04 03:59:56 +02:00
|
|
|
* @global WP_Query $wp_query WordPress Query object.
|
2015-05-28 23:41:30 +02:00
|
|
|
* @global int $per_page
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
public function prepare_items() {
|
2020-07-10 18:04:05 +02:00
|
|
|
global $mode, $avail_post_stati, $wp_query, $per_page;
|
|
|
|
|
|
|
|
if ( ! empty( $_REQUEST['mode'] ) ) {
|
2020-07-12 13:36:04 +02:00
|
|
|
$mode = 'excerpt' === $_REQUEST['mode'] ? 'excerpt' : 'list';
|
2020-07-10 18:04:05 +02:00
|
|
|
set_user_setting( 'posts_list_mode', $mode );
|
|
|
|
} else {
|
|
|
|
$mode = get_user_setting( 'posts_list_mode', 'list' );
|
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
// Is going to call wp().
|
2010-10-25 02:12:41 +02:00
|
|
|
$avail_post_stati = wp_edit_posts_query();
|
|
|
|
|
2021-05-03 15:57:04 +02:00
|
|
|
$this->set_hierarchical_display(
|
|
|
|
is_post_type_hierarchical( $this->screen->post_type )
|
|
|
|
&& 'menu_order title' === $wp_query->query['orderby']
|
|
|
|
);
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2012-09-19 14:43:31 +02:00
|
|
|
$post_type = $this->screen->post_type;
|
2017-12-01 00:11:00 +01:00
|
|
|
$per_page = $this->get_items_per_page( 'edit_' . $post_type . '_per_page' );
|
2014-02-25 07:12:13 +01:00
|
|
|
|
2014-03-24 02:49:14 +01:00
|
|
|
/** This filter is documented in wp-admin/includes/post.php */
|
2017-12-01 00:11:00 +01:00
|
|
|
$per_page = apply_filters( 'edit_posts_per_page', $per_page, $post_type );
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2015-09-17 23:18:24 +02:00
|
|
|
if ( $this->hierarchical_display ) {
|
|
|
|
$total_items = $wp_query->post_count;
|
2015-11-18 21:25:26 +01:00
|
|
|
} elseif ( $wp_query->found_posts || $this->get_pagenum() === 1 ) {
|
2015-11-12 00:14:26 +01:00
|
|
|
$total_items = $wp_query->found_posts;
|
2015-09-17 23:18:24 +02:00
|
|
|
} else {
|
|
|
|
$post_counts = (array) wp_count_posts( $post_type, 'readable' );
|
|
|
|
|
2020-04-05 05:02:11 +02:00
|
|
|
if ( isset( $_REQUEST['post_status'] ) && in_array( $_REQUEST['post_status'], $avail_post_stati, true ) ) {
|
2015-09-17 23:18:24 +02:00
|
|
|
$total_items = $post_counts[ $_REQUEST['post_status'] ];
|
|
|
|
} elseif ( isset( $_REQUEST['show_sticky'] ) && $_REQUEST['show_sticky'] ) {
|
|
|
|
$total_items = $this->sticky_posts_count;
|
2021-05-03 15:57:04 +02:00
|
|
|
} elseif ( isset( $_GET['author'] ) && get_current_user_id() === (int) $_GET['author'] ) {
|
2015-10-05 23:36:25 +02:00
|
|
|
$total_items = $this->user_posts_count;
|
2015-09-17 23:18:24 +02:00
|
|
|
} else {
|
|
|
|
$total_items = array_sum( $post_counts );
|
|
|
|
|
|
|
|
// Subtract post types that are not included in the admin all list.
|
|
|
|
foreach ( get_post_stati( array( 'show_in_admin_all_list' => false ) ) as $state ) {
|
|
|
|
$total_items -= $post_counts[ $state ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-09 17:55:09 +01:00
|
|
|
$this->is_trash = isset( $_REQUEST['post_status'] ) && 'trash' === $_REQUEST['post_status'];
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
$this->set_pagination_args(
|
|
|
|
array(
|
|
|
|
'total_items' => $total_items,
|
|
|
|
'per_page' => $per_page,
|
|
|
|
)
|
|
|
|
);
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2015-05-29 22:17:26 +02:00
|
|
|
/**
|
|
|
|
* @return bool
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
public function has_items() {
|
2010-10-25 02:12:41 +02:00
|
|
|
return have_posts();
|
|
|
|
}
|
|
|
|
|
2015-05-29 23:32:24 +02:00
|
|
|
/**
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
public function no_items() {
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( isset( $_REQUEST['post_status'] ) && 'trash' === $_REQUEST['post_status'] ) {
|
2012-09-19 14:43:31 +02:00
|
|
|
echo get_post_type_object( $this->screen->post_type )->labels->not_found_in_trash;
|
2017-12-01 00:11:00 +01:00
|
|
|
} else {
|
2012-09-19 14:43:31 +02:00
|
|
|
echo get_post_type_object( $this->screen->post_type )->labels->not_found;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2015-03-19 03:26:26 +01:00
|
|
|
/**
|
2015-04-04 18:01:27 +02:00
|
|
|
* Determine if the current view is the "All" view.
|
2015-03-19 03:26:26 +01:00
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*
|
2015-05-29 22:17:26 +02:00
|
|
|
* @return bool Whether the current view is the "All" view.
|
2015-03-19 03:26:26 +01:00
|
|
|
*/
|
|
|
|
protected function is_base_request() {
|
2015-09-19 20:17:24 +02:00
|
|
|
$vars = $_GET;
|
|
|
|
unset( $vars['paged'] );
|
2015-09-22 08:06:25 +02:00
|
|
|
|
2015-09-19 20:17:24 +02:00
|
|
|
if ( empty( $vars ) ) {
|
2015-03-19 03:26:26 +01:00
|
|
|
return true;
|
2015-09-19 20:17:24 +02:00
|
|
|
} elseif ( 1 === count( $vars ) && ! empty( $vars['post_type'] ) ) {
|
|
|
|
return $this->screen->post_type === $vars['post_type'];
|
2015-03-19 03:26:26 +01:00
|
|
|
}
|
2015-09-12 19:13:25 +02:00
|
|
|
|
2015-09-19 20:17:24 +02:00
|
|
|
return 1 === count( $vars ) && ! empty( $vars['mode'] );
|
2015-09-12 19:13:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2015-09-16 17:01:27 +02:00
|
|
|
* Helper to create links to edit.php with params.
|
2015-09-12 19:13:25 +02:00
|
|
|
*
|
|
|
|
* @since 4.4.0
|
|
|
|
*
|
2018-03-22 21:27:32 +01:00
|
|
|
* @param string[] $args Associative array of URL parameters for the link.
|
|
|
|
* @param string $label Link text.
|
|
|
|
* @param string $class Optional. Class attribute. Default empty string.
|
2015-09-12 19:13:25 +02:00
|
|
|
* @return string The formatted link string.
|
|
|
|
*/
|
|
|
|
protected function get_edit_link( $args, $label, $class = '' ) {
|
|
|
|
$url = add_query_arg( $args, 'edit.php' );
|
|
|
|
|
2019-07-01 14:52:01 +02:00
|
|
|
$class_html = '';
|
|
|
|
$aria_current = '';
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2015-09-12 19:13:25 +02:00
|
|
|
if ( ! empty( $class ) ) {
|
2017-11-27 00:57:55 +01:00
|
|
|
$class_html = sprintf(
|
2015-09-12 19:13:25 +02:00
|
|
|
' class="%s"',
|
|
|
|
esc_attr( $class )
|
|
|
|
);
|
2017-10-02 21:44:47 +02:00
|
|
|
|
|
|
|
if ( 'current' === $class ) {
|
|
|
|
$aria_current = ' aria-current="page"';
|
|
|
|
}
|
2015-09-12 19:13:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return sprintf(
|
2017-10-02 21:44:47 +02:00
|
|
|
'<a href="%s"%s%s>%s</a>',
|
2015-09-12 19:13:25 +02:00
|
|
|
esc_url( $url ),
|
|
|
|
$class_html,
|
2017-10-02 21:44:47 +02:00
|
|
|
$aria_current,
|
2015-09-12 19:13:25 +02:00
|
|
|
$label
|
|
|
|
);
|
2015-03-19 03:26:26 +01:00
|
|
|
}
|
|
|
|
|
2015-05-28 23:41:30 +02:00
|
|
|
/**
|
|
|
|
* @global array $locked_post_status This seems to be deprecated.
|
|
|
|
* @global array $avail_post_stati
|
|
|
|
* @return array
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
protected function get_views() {
|
2012-09-19 14:43:31 +02:00
|
|
|
global $locked_post_status, $avail_post_stati;
|
2011-11-06 22:14:27 +01:00
|
|
|
|
2012-09-19 14:43:31 +02:00
|
|
|
$post_type = $this->screen->post_type;
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( ! empty( $locked_post_status ) ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
return array();
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
$status_links = array();
|
2017-12-01 00:11:00 +01:00
|
|
|
$num_posts = wp_count_posts( $post_type, 'readable' );
|
|
|
|
$total_posts = array_sum( (array) $num_posts );
|
|
|
|
$class = '';
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
$current_user_id = get_current_user_id();
|
2017-12-01 00:11:00 +01:00
|
|
|
$all_args = array( 'post_type' => $post_type );
|
|
|
|
$mine = '';
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2015-09-28 21:15:24 +02:00
|
|
|
// Subtract post types that are not included in the admin all list.
|
|
|
|
foreach ( get_post_stati( array( 'show_in_admin_all_list' => false ) ) as $state ) {
|
|
|
|
$total_posts -= $num_posts->$state;
|
|
|
|
}
|
|
|
|
|
2015-09-26 08:51:26 +02:00
|
|
|
if ( $this->user_posts_count && $this->user_posts_count !== $total_posts ) {
|
2021-05-03 15:57:04 +02:00
|
|
|
if ( isset( $_GET['author'] ) && ( $current_user_id === (int) $_GET['author'] ) ) {
|
2015-09-12 19:13:25 +02:00
|
|
|
$class = 'current';
|
|
|
|
}
|
|
|
|
|
|
|
|
$mine_args = array(
|
|
|
|
'post_type' => $post_type,
|
2017-12-01 00:11:00 +01:00
|
|
|
'author' => $current_user_id,
|
2015-09-12 19:13:25 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
$mine_inner_html = sprintf(
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Number of posts. */
|
2015-09-12 19:13:25 +02:00
|
|
|
_nx(
|
|
|
|
'Mine <span class="count">(%s)</span>',
|
|
|
|
'Mine <span class="count">(%s)</span>',
|
|
|
|
$this->user_posts_count,
|
|
|
|
'posts'
|
|
|
|
),
|
|
|
|
number_format_i18n( $this->user_posts_count )
|
|
|
|
);
|
|
|
|
|
2015-09-20 19:28:24 +02:00
|
|
|
$mine = $this->get_edit_link( $mine_args, $mine_inner_html, $class );
|
2015-09-12 19:13:25 +02:00
|
|
|
|
|
|
|
$all_args['all_posts'] = 1;
|
2017-12-01 00:11:00 +01:00
|
|
|
$class = '';
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2015-10-07 02:09:24 +02:00
|
|
|
if ( empty( $class ) && ( $this->is_base_request() || isset( $_REQUEST['all_posts'] ) ) ) {
|
2015-09-12 19:13:25 +02:00
|
|
|
$class = 'current';
|
2015-03-19 03:26:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
$all_inner_html = sprintf(
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Number of posts. */
|
2015-03-19 03:26:26 +01:00
|
|
|
_nx(
|
|
|
|
'All <span class="count">(%s)</span>',
|
|
|
|
'All <span class="count">(%s)</span>',
|
|
|
|
$total_posts,
|
|
|
|
'posts'
|
|
|
|
),
|
|
|
|
number_format_i18n( $total_posts )
|
|
|
|
);
|
|
|
|
|
2015-09-12 19:13:25 +02:00
|
|
|
$status_links['all'] = $this->get_edit_link( $all_args, $all_inner_html, $class );
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2015-09-20 19:28:24 +02:00
|
|
|
if ( $mine ) {
|
|
|
|
$status_links['mine'] = $mine;
|
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
foreach ( get_post_stati( array( 'show_in_admin_status_list' => true ), 'objects' ) as $status ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
$class = '';
|
|
|
|
|
|
|
|
$status_name = $status->name;
|
|
|
|
|
2020-04-05 05:02:11 +02:00
|
|
|
if ( ! in_array( $status_name, $avail_post_stati, true ) || empty( $num_posts->$status_name ) ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
continue;
|
2015-09-12 19:13:25 +02:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( isset( $_REQUEST['post_status'] ) && $status_name === $_REQUEST['post_status'] ) {
|
2015-09-12 19:13:25 +02:00
|
|
|
$class = 'current';
|
|
|
|
}
|
|
|
|
|
|
|
|
$status_args = array(
|
|
|
|
'post_status' => $status_name,
|
2017-12-01 00:11:00 +01:00
|
|
|
'post_type' => $post_type,
|
2015-09-12 19:13:25 +02:00
|
|
|
);
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2015-09-12 19:13:25 +02:00
|
|
|
$status_label = sprintf(
|
|
|
|
translate_nooped_plural( $status->label_count, $num_posts->$status_name ),
|
|
|
|
number_format_i18n( $num_posts->$status_name )
|
|
|
|
);
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2015-09-12 19:13:25 +02:00
|
|
|
$status_links[ $status_name ] = $this->get_edit_link( $status_args, $status_label, $class );
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2010-10-27 10:27:45 +02:00
|
|
|
if ( ! empty( $this->sticky_posts_count ) ) {
|
2015-09-12 19:13:25 +02:00
|
|
|
$class = ! empty( $_REQUEST['show_sticky'] ) ? 'current' : '';
|
|
|
|
|
|
|
|
$sticky_args = array(
|
2017-12-01 00:11:00 +01:00
|
|
|
'post_type' => $post_type,
|
|
|
|
'show_sticky' => 1,
|
2015-09-12 19:13:25 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
$sticky_inner_html = sprintf(
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Number of posts. */
|
2015-09-12 19:13:25 +02:00
|
|
|
_nx(
|
|
|
|
'Sticky <span class="count">(%s)</span>',
|
|
|
|
'Sticky <span class="count">(%s)</span>',
|
|
|
|
$this->sticky_posts_count,
|
|
|
|
'posts'
|
|
|
|
),
|
|
|
|
number_format_i18n( $this->sticky_posts_count )
|
|
|
|
);
|
|
|
|
|
|
|
|
$sticky_link = array(
|
2017-12-01 00:11:00 +01:00
|
|
|
'sticky' => $this->get_edit_link( $sticky_args, $sticky_inner_html, $class ),
|
2015-09-12 19:13:25 +02:00
|
|
|
);
|
2010-10-27 10:27:45 +02:00
|
|
|
|
|
|
|
// Sticky comes after Publish, or if not listed, after All.
|
2020-04-05 05:02:11 +02:00
|
|
|
$split = 1 + array_search( ( isset( $status_links['publish'] ) ? 'publish' : 'all' ), array_keys( $status_links ), true );
|
2010-10-27 10:27:45 +02:00
|
|
|
$status_links = array_merge( array_slice( $status_links, 0, $split ), $sticky_link, array_slice( $status_links, $split ) );
|
|
|
|
}
|
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
return $status_links;
|
|
|
|
}
|
|
|
|
|
2015-05-29 22:17:26 +02:00
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
protected function get_bulk_actions() {
|
2017-12-01 00:11:00 +01:00
|
|
|
$actions = array();
|
2014-09-23 04:58:16 +02:00
|
|
|
$post_type_obj = get_post_type_object( $this->screen->post_type );
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2015-08-25 22:12:22 +02:00
|
|
|
if ( current_user_can( $post_type_obj->cap->edit_posts ) ) {
|
|
|
|
if ( $this->is_trash ) {
|
|
|
|
$actions['untrash'] = __( 'Restore' );
|
|
|
|
} else {
|
|
|
|
$actions['edit'] = __( 'Edit' );
|
|
|
|
}
|
2014-09-23 04:58:16 +02:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2014-09-23 04:58:16 +02:00
|
|
|
if ( current_user_can( $post_type_obj->cap->delete_posts ) ) {
|
|
|
|
if ( $this->is_trash || ! EMPTY_TRASH_DAYS ) {
|
2020-07-06 23:52:21 +02:00
|
|
|
$actions['delete'] = __( 'Delete permanently' );
|
2014-09-23 04:58:16 +02:00
|
|
|
} else {
|
2020-07-24 02:21:03 +02:00
|
|
|
$actions['trash'] = __( 'Move to Trash' );
|
2014-09-23 04:58:16 +02:00
|
|
|
}
|
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
return $actions;
|
|
|
|
}
|
|
|
|
|
2014-12-01 01:33:23 +01:00
|
|
|
/**
|
2016-06-26 16:26:29 +02:00
|
|
|
* Displays a categories drop-down for filtering on the Posts list table.
|
|
|
|
*
|
|
|
|
* @since 4.6.0
|
|
|
|
*
|
|
|
|
* @global int $cat Currently selected category.
|
|
|
|
*
|
2016-07-09 16:00:31 +02:00
|
|
|
* @param string $post_type Post type slug.
|
2016-06-26 16:26:29 +02:00
|
|
|
*/
|
|
|
|
protected function categories_dropdown( $post_type ) {
|
|
|
|
global $cat;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Filters whether to remove the 'Categories' drop-down from the post list table.
|
|
|
|
*
|
|
|
|
* @since 4.6.0
|
|
|
|
*
|
|
|
|
* @param bool $disable Whether to disable the categories drop-down. Default false.
|
2016-07-09 16:00:31 +02:00
|
|
|
* @param string $post_type Post type slug.
|
2016-06-26 16:26:29 +02:00
|
|
|
*/
|
|
|
|
if ( false !== apply_filters( 'disable_categories_dropdown', false, $post_type ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( is_object_in_taxonomy( $post_type, 'category' ) ) {
|
|
|
|
$dropdown_options = array(
|
|
|
|
'show_option_all' => get_taxonomy( 'category' )->labels->all_items,
|
2017-12-01 00:11:00 +01:00
|
|
|
'hide_empty' => 0,
|
|
|
|
'hierarchical' => 1,
|
|
|
|
'show_count' => 0,
|
|
|
|
'orderby' => 'name',
|
|
|
|
'selected' => $cat,
|
2016-06-26 16:26:29 +02:00
|
|
|
);
|
|
|
|
|
2021-02-01 15:13:00 +01:00
|
|
|
echo '<label class="screen-reader-text" for="cat">' . get_taxonomy( 'category' )->labels->filter_by_item . '</label>';
|
|
|
|
|
2016-06-26 16:26:29 +02:00
|
|
|
wp_dropdown_categories( $dropdown_options );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-21 16:32:01 +01:00
|
|
|
/**
|
|
|
|
* Displays a formats drop-down for filtering items.
|
|
|
|
*
|
|
|
|
* @since 5.2.0
|
|
|
|
* @access protected
|
|
|
|
*
|
2020-03-18 20:13:10 +01:00
|
|
|
* @param string $post_type Post type slug.
|
2019-03-21 16:32:01 +01:00
|
|
|
*/
|
|
|
|
protected function formats_dropdown( $post_type ) {
|
|
|
|
/**
|
|
|
|
* Filters whether to remove the 'Formats' drop-down from the post list table.
|
|
|
|
*
|
|
|
|
* @since 5.2.0
|
2020-03-18 20:13:10 +01:00
|
|
|
* @since 5.5.0 The `$post_type` parameter was added.
|
2019-03-21 16:32:01 +01:00
|
|
|
*
|
2020-03-18 20:13:10 +01:00
|
|
|
* @param bool $disable Whether to disable the drop-down. Default false.
|
|
|
|
* @param string $post_type Post type slug.
|
2019-03-21 16:32:01 +01:00
|
|
|
*/
|
2020-03-18 20:13:10 +01:00
|
|
|
if ( apply_filters( 'disable_formats_dropdown', false, $post_type ) ) {
|
2019-03-21 16:32:01 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-06-28 16:30:07 +02:00
|
|
|
// Return if the post type doesn't have post formats or if we're in the Trash.
|
|
|
|
if ( ! is_object_in_taxonomy( $post_type, 'post_format' ) || $this->is_trash ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-03-21 16:32:01 +01:00
|
|
|
// Make sure the dropdown shows only formats with a post count greater than 0.
|
|
|
|
$used_post_formats = get_terms(
|
|
|
|
array(
|
|
|
|
'taxonomy' => 'post_format',
|
|
|
|
'hide_empty' => true,
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
2020-06-28 16:30:07 +02:00
|
|
|
// Return if there are no posts using formats.
|
|
|
|
if ( ! $used_post_formats ) {
|
2019-03-21 16:32:01 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$displayed_post_format = isset( $_GET['post_format'] ) ? $_GET['post_format'] : '';
|
|
|
|
?>
|
|
|
|
<label for="filter-by-format" class="screen-reader-text"><?php _e( 'Filter by post format' ); ?></label>
|
|
|
|
<select name="post_format" id="filter-by-format">
|
|
|
|
<option<?php selected( $displayed_post_format, '' ); ?> value=""><?php _e( 'All formats' ); ?></option>
|
|
|
|
<?php
|
|
|
|
foreach ( $used_post_formats as $used_post_format ) {
|
|
|
|
// Post format slug.
|
|
|
|
$slug = str_replace( 'post-format-', '', $used_post_format->slug );
|
|
|
|
// Pretty, translated version of the post format slug.
|
|
|
|
$pretty_name = get_post_format_string( $slug );
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2019-03-21 16:32:01 +01:00
|
|
|
// Skip the standard post format.
|
|
|
|
if ( 'standard' === $slug ) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
?>
|
|
|
|
<option<?php selected( $displayed_post_format, $slug ); ?> value="<?php echo esc_attr( $slug ); ?>"><?php echo esc_html( $pretty_name ); ?></option>
|
|
|
|
<?php
|
|
|
|
}
|
|
|
|
?>
|
|
|
|
</select>
|
|
|
|
<?php
|
|
|
|
}
|
|
|
|
|
2016-06-26 16:26:29 +02:00
|
|
|
/**
|
2014-12-01 01:33:23 +01:00
|
|
|
* @param string $which
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
protected function extra_tablenav( $which ) {
|
2018-08-17 03:51:36 +02:00
|
|
|
?>
|
2010-10-25 02:12:41 +02:00
|
|
|
<div class="alignleft actions">
|
2018-08-17 03:51:36 +02:00
|
|
|
<?php
|
2020-06-30 22:36:05 +02:00
|
|
|
if ( 'top' === $which ) {
|
2018-08-17 03:51:36 +02:00
|
|
|
ob_start();
|
2011-01-01 00:56:38 +01:00
|
|
|
|
2018-08-17 03:51:36 +02:00
|
|
|
$this->months_dropdown( $this->screen->post_type );
|
|
|
|
$this->categories_dropdown( $this->screen->post_type );
|
2019-03-21 16:32:01 +01:00
|
|
|
$this->formats_dropdown( $this->screen->post_type );
|
2014-02-25 07:12:13 +01:00
|
|
|
|
2018-08-17 03:51:36 +02:00
|
|
|
/**
|
|
|
|
* Fires before the Filter button on the Posts and Pages list tables.
|
|
|
|
*
|
|
|
|
* The Filter button allows sorting by date and/or category on the
|
|
|
|
* Posts list table, and sorting by date on the Pages list table.
|
|
|
|
*
|
|
|
|
* @since 2.1.0
|
|
|
|
* @since 4.4.0 The `$post_type` parameter was added.
|
|
|
|
* @since 4.6.0 The `$which` parameter was added.
|
|
|
|
*
|
|
|
|
* @param string $post_type The post type slug.
|
|
|
|
* @param string $which The location of the extra table nav markup:
|
|
|
|
* 'top' or 'bottom' for WP_Posts_List_Table,
|
|
|
|
* 'bar' for WP_Media_List_Table.
|
|
|
|
*/
|
|
|
|
do_action( 'restrict_manage_posts', $this->screen->post_type, $which );
|
2014-02-25 07:12:13 +01:00
|
|
|
|
2018-08-17 03:51:36 +02:00
|
|
|
$output = ob_get_clean();
|
2016-10-21 12:33:54 +02:00
|
|
|
|
2018-08-17 03:51:36 +02:00
|
|
|
if ( ! empty( $output ) ) {
|
|
|
|
echo $output;
|
|
|
|
submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) );
|
|
|
|
}
|
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2021-05-03 15:57:04 +02:00
|
|
|
if ( $this->is_trash && $this->has_items()
|
|
|
|
&& current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_others_posts )
|
|
|
|
) {
|
2018-08-17 03:51:36 +02:00
|
|
|
submit_button( __( 'Empty Trash' ), 'apply', 'delete_all', false );
|
|
|
|
}
|
|
|
|
?>
|
2011-01-01 00:56:38 +01:00
|
|
|
</div>
|
2018-08-17 03:51:36 +02:00
|
|
|
<?php
|
2015-10-18 16:56:23 +02:00
|
|
|
/**
|
|
|
|
* Fires immediately following the closing "actions" div in the tablenav for the posts
|
|
|
|
* list table.
|
|
|
|
*
|
|
|
|
* @since 4.4.0
|
2015-11-04 22:29:25 +01:00
|
|
|
*
|
2015-10-18 16:56:23 +02:00
|
|
|
* @param string $which The location of the extra table nav markup: 'top' or 'bottom'.
|
|
|
|
*/
|
|
|
|
do_action( 'manage_posts_extra_tablenav', $which );
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2015-05-29 22:17:26 +02:00
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
public function current_action() {
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
return 'delete_all';
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
return parent::current_action();
|
|
|
|
}
|
|
|
|
|
2015-05-29 22:17:26 +02:00
|
|
|
/**
|
2020-07-10 18:04:05 +02:00
|
|
|
* @global string $mode List table view mode.
|
|
|
|
*
|
2015-05-29 22:17:26 +02:00
|
|
|
* @return array
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
protected function get_table_classes() {
|
2020-07-10 18:04:05 +02:00
|
|
|
global $mode;
|
|
|
|
|
|
|
|
$mode_class = esc_attr( 'table-view-' . $mode );
|
2020-07-07 21:12:03 +02:00
|
|
|
|
2021-05-03 15:57:04 +02:00
|
|
|
return array(
|
|
|
|
'widefat',
|
|
|
|
'fixed',
|
|
|
|
'striped',
|
|
|
|
$mode_class,
|
|
|
|
is_post_type_hierarchical( $this->screen->post_type ) ? 'pages' : 'posts',
|
|
|
|
);
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2015-05-29 22:17:26 +02:00
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
2014-07-12 05:27:14 +02:00
|
|
|
public function get_columns() {
|
2012-09-19 14:43:31 +02:00
|
|
|
$post_type = $this->screen->post_type;
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
$posts_columns = array();
|
2010-11-14 21:35:42 +01:00
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
$posts_columns['cb'] = '<input type="checkbox" />';
|
2010-11-14 21:35:42 +01:00
|
|
|
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: Posts screen column name. */
|
2010-10-25 02:12:41 +02:00
|
|
|
$posts_columns['title'] = _x( 'Title', 'column name' );
|
2010-11-14 21:35:42 +01:00
|
|
|
|
2014-05-30 18:59:14 +02:00
|
|
|
if ( post_type_supports( $post_type, 'author' ) ) {
|
2010-11-14 21:35:42 +01:00
|
|
|
$posts_columns['author'] = __( 'Author' );
|
2014-05-30 18:59:14 +02:00
|
|
|
}
|
2010-11-14 21:35:42 +01:00
|
|
|
|
2012-09-08 05:18:36 +02:00
|
|
|
$taxonomies = get_object_taxonomies( $post_type, 'objects' );
|
|
|
|
$taxonomies = wp_filter_object_list( $taxonomies, array( 'show_admin_column' => true ), 'and', 'name' );
|
|
|
|
|
2014-02-25 07:12:13 +01:00
|
|
|
/**
|
2016-05-22 20:01:30 +02:00
|
|
|
* Filters the taxonomy columns in the Posts list table.
|
2014-02-25 07:12:13 +01:00
|
|
|
*
|
2014-11-30 12:28:24 +01:00
|
|
|
* The dynamic portion of the hook name, `$post_type`, refers to the post
|
2014-02-25 07:12:13 +01:00
|
|
|
* type slug.
|
|
|
|
*
|
2021-03-07 13:32:09 +01:00
|
|
|
* Possible hook names include:
|
|
|
|
*
|
|
|
|
* - `manage_taxonomies_for_post_columns`
|
|
|
|
* - `manage_taxonomies_for_page_columns`
|
|
|
|
*
|
2014-02-25 07:12:13 +01:00
|
|
|
* @since 3.5.0
|
|
|
|
*
|
2018-03-22 21:27:32 +01:00
|
|
|
* @param string[] $taxonomies Array of taxonomy names to show columns for.
|
|
|
|
* @param string $post_type The post type.
|
2014-02-25 07:12:13 +01:00
|
|
|
*/
|
2012-09-08 05:18:36 +02:00
|
|
|
$taxonomies = apply_filters( "manage_taxonomies_for_{$post_type}_columns", $taxonomies, $post_type );
|
|
|
|
$taxonomies = array_filter( $taxonomies, 'taxonomy_exists' );
|
|
|
|
|
|
|
|
foreach ( $taxonomies as $taxonomy ) {
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( 'category' === $taxonomy ) {
|
2012-09-08 05:18:36 +02:00
|
|
|
$column_key = 'categories';
|
2017-12-01 00:11:00 +01:00
|
|
|
} elseif ( 'post_tag' === $taxonomy ) {
|
2012-09-08 05:18:36 +02:00
|
|
|
$column_key = 'tags';
|
2017-12-01 00:11:00 +01:00
|
|
|
} else {
|
2012-09-08 05:18:36 +02:00
|
|
|
$column_key = 'taxonomy-' . $taxonomy;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2012-09-08 05:18:36 +02:00
|
|
|
|
|
|
|
$posts_columns[ $column_key ] = get_taxonomy( $taxonomy )->labels->name;
|
|
|
|
}
|
2010-11-14 21:35:42 +01:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
$post_status = ! empty( $_REQUEST['post_status'] ) ? $_REQUEST['post_status'] : 'all';
|
2021-05-03 15:57:04 +02:00
|
|
|
|
|
|
|
if ( post_type_supports( $post_type, 'comments' )
|
|
|
|
&& ! in_array( $post_status, array( 'pending', 'draft', 'future' ), true )
|
|
|
|
) {
|
|
|
|
$posts_columns['comments'] = sprintf(
|
|
|
|
'<span class="vers comment-grey-bubble" title="%1$s"><span class="screen-reader-text">%2$s</span></span>',
|
|
|
|
esc_attr__( 'Comments' ),
|
|
|
|
__( 'Comments' )
|
|
|
|
);
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-11-14 21:35:42 +01:00
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
$posts_columns['date'] = __( 'Date' );
|
|
|
|
|
2015-09-22 08:06:25 +02:00
|
|
|
if ( 'page' === $post_type ) {
|
2014-02-25 07:12:13 +01:00
|
|
|
|
|
|
|
/**
|
2016-05-22 20:01:30 +02:00
|
|
|
* Filters the columns displayed in the Pages list table.
|
2014-02-25 07:12:13 +01:00
|
|
|
*
|
|
|
|
* @since 2.5.0
|
|
|
|
*
|
2018-03-22 21:27:32 +01:00
|
|
|
* @param string[] $post_columns An associative array of column headings.
|
2014-02-25 07:12:13 +01:00
|
|
|
*/
|
2010-10-25 02:12:41 +02:00
|
|
|
$posts_columns = apply_filters( 'manage_pages_columns', $posts_columns );
|
2014-02-25 07:12:13 +01:00
|
|
|
} else {
|
|
|
|
|
|
|
|
/**
|
2016-05-22 20:01:30 +02:00
|
|
|
* Filters the columns displayed in the Posts list table.
|
2014-02-25 07:12:13 +01:00
|
|
|
*
|
|
|
|
* @since 1.5.0
|
|
|
|
*
|
2018-03-22 21:27:32 +01:00
|
|
|
* @param string[] $post_columns An associative array of column headings.
|
|
|
|
* @param string $post_type The post type slug.
|
2014-02-25 07:12:13 +01:00
|
|
|
*/
|
2010-10-25 02:12:41 +02:00
|
|
|
$posts_columns = apply_filters( 'manage_posts_columns', $posts_columns, $post_type );
|
2014-02-25 07:12:13 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2016-05-22 20:01:30 +02:00
|
|
|
* Filters the columns displayed in the Posts list table for a specific post type.
|
2014-02-25 07:12:13 +01:00
|
|
|
*
|
2014-11-30 12:28:24 +01:00
|
|
|
* The dynamic portion of the hook name, `$post_type`, refers to the post type slug.
|
2014-02-25 07:12:13 +01:00
|
|
|
*
|
2021-03-07 13:32:09 +01:00
|
|
|
* Possible hook names include:
|
|
|
|
*
|
|
|
|
* - `manage_post_posts_columns`
|
|
|
|
* - `manage_page_posts_columns`
|
|
|
|
*
|
2014-02-25 07:12:13 +01:00
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-03-22 21:27:32 +01:00
|
|
|
* @param string[] $post_columns An associative array of column headings.
|
2014-02-25 07:12:13 +01:00
|
|
|
*/
|
2015-05-29 22:17:26 +02:00
|
|
|
return apply_filters( "manage_{$post_type}_posts_columns", $posts_columns );
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2015-05-29 22:17:26 +02:00
|
|
|
/**
|
|
|
|
* @return array
|
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
protected function get_sortable_columns() {
|
2010-10-25 02:12:41 +02:00
|
|
|
return array(
|
|
|
|
'title' => 'title',
|
|
|
|
'parent' => 'parent',
|
|
|
|
'comments' => 'comment_count',
|
2017-12-01 00:11:00 +01:00
|
|
|
'date' => array( 'date', true ),
|
2010-10-25 02:12:41 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2014-12-01 01:33:23 +01:00
|
|
|
/**
|
2019-08-04 03:59:56 +02:00
|
|
|
* @global WP_Query $wp_query WordPress Query object.
|
2014-12-01 01:33:23 +01:00
|
|
|
* @global int $per_page
|
|
|
|
* @param array $posts
|
2020-07-23 22:01:04 +02:00
|
|
|
* @param int $level
|
2014-12-01 01:33:23 +01:00
|
|
|
*/
|
2014-07-14 00:09:16 +02:00
|
|
|
public function display_rows( $posts = array(), $level = 0 ) {
|
2012-09-19 14:43:31 +02:00
|
|
|
global $wp_query, $per_page;
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( empty( $posts ) ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
$posts = $wp_query->posts;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2011-04-22 20:33:53 +02:00
|
|
|
add_filter( 'the_title', 'esc_html' );
|
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
if ( $this->hierarchical_display ) {
|
|
|
|
$this->_display_rows_hierarchical( $posts, $this->get_pagenum(), $per_page );
|
|
|
|
} else {
|
2012-06-30 11:28:15 +02:00
|
|
|
$this->_display_rows( $posts, $level );
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-12-01 01:33:23 +01:00
|
|
|
/**
|
|
|
|
* @param array $posts
|
2020-07-23 22:01:04 +02:00
|
|
|
* @param int $level
|
2014-12-01 01:33:23 +01:00
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
private function _display_rows( $posts, $level = 0 ) {
|
2018-02-02 08:38:32 +01:00
|
|
|
$post_type = $this->screen->post_type;
|
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
// Create array of post IDs.
|
|
|
|
$post_ids = array();
|
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
foreach ( $posts as $a_post ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
$post_ids[] = $a_post->ID;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2018-02-02 08:38:32 +01:00
|
|
|
if ( post_type_supports( $post_type, 'comments' ) ) {
|
|
|
|
$this->comment_pending_count = get_pending_comments_num( $post_ids );
|
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
foreach ( $posts as $post ) {
|
2012-06-30 11:28:15 +02:00
|
|
|
$this->single_row( $post, $level );
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2014-12-01 01:33:23 +01:00
|
|
|
/**
|
2019-08-04 03:12:56 +02:00
|
|
|
* @global wpdb $wpdb WordPress database abstraction object.
|
2019-08-04 14:28:56 +02:00
|
|
|
* @global WP_Post $post Global post object.
|
2014-12-01 01:33:23 +01:00
|
|
|
* @param array $pages
|
2020-07-23 22:01:04 +02:00
|
|
|
* @param int $pagenum
|
|
|
|
* @param int $per_page
|
2014-12-01 01:33:23 +01:00
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
private function _display_rows_hierarchical( $pages, $pagenum = 1, $per_page = 20 ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
global $wpdb;
|
|
|
|
|
|
|
|
$level = 0;
|
|
|
|
|
|
|
|
if ( ! $pages ) {
|
|
|
|
$pages = get_pages( array( 'sort_column' => 'menu_order' ) );
|
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( ! $pages ) {
|
2015-05-29 22:17:26 +02:00
|
|
|
return;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
2021-11-19 15:44:01 +01:00
|
|
|
* Arrange pages into two parts: top level pages and children_pages.
|
|
|
|
* children_pages is two dimensional array. Example:
|
2010-10-25 02:12:41 +02:00
|
|
|
* children_pages[10][] contains all sub-pages whose parent is 10.
|
|
|
|
* It only takes O( N ) to arrange this and it takes O( 1 ) for subsequent lookup operations
|
|
|
|
* If searching, ignore hierarchy and treat everything as top level
|
|
|
|
*/
|
|
|
|
if ( empty( $_REQUEST['s'] ) ) {
|
|
|
|
$top_level_pages = array();
|
2017-12-01 00:11:00 +01:00
|
|
|
$children_pages = array();
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
foreach ( $pages as $page ) {
|
2014-07-17 11:14:16 +02:00
|
|
|
// Catch and repair bad pages.
|
2021-05-03 15:57:04 +02:00
|
|
|
if ( $page->post_parent === $page->ID ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
$page->post_parent = 0;
|
|
|
|
$wpdb->update( $wpdb->posts, array( 'post_parent' => 0 ), array( 'ID' => $page->ID ) );
|
2012-04-24 00:04:35 +02:00
|
|
|
clean_post_cache( $page );
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2021-05-03 15:57:04 +02:00
|
|
|
if ( $page->post_parent > 0 ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
$children_pages[ $page->post_parent ][] = $page;
|
2021-05-03 15:57:04 +02:00
|
|
|
} else {
|
|
|
|
$top_level_pages[] = $page;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
$pages = &$top_level_pages;
|
|
|
|
}
|
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
$count = 0;
|
|
|
|
$start = ( $pagenum - 1 ) * $per_page;
|
|
|
|
$end = $start + $per_page;
|
2015-03-11 21:46:27 +01:00
|
|
|
$to_display = array();
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
foreach ( $pages as $page ) {
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( $count >= $end ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
break;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2013-04-29 03:10:50 +02:00
|
|
|
if ( $count >= $start ) {
|
2017-12-01 00:11:00 +01:00
|
|
|
$to_display[ $page->ID ] = $level;
|
2013-04-29 03:10:50 +02:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
$count++;
|
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( isset( $children_pages ) ) {
|
2015-03-11 21:46:27 +01:00
|
|
|
$this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display );
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2014-07-17 11:14:16 +02:00
|
|
|
// If it is the last pagenum and there are orphaned pages, display them with paging as well.
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( isset( $children_pages ) && $count < $end ) {
|
|
|
|
foreach ( $children_pages as $orphans ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
foreach ( $orphans as $op ) {
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( $count >= $end ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
break;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2013-04-29 03:10:50 +02:00
|
|
|
|
|
|
|
if ( $count >= $start ) {
|
2017-12-01 00:11:00 +01:00
|
|
|
$to_display[ $op->ID ] = 0;
|
2013-04-29 03:10:50 +02:00
|
|
|
}
|
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
$count++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-03-11 21:46:27 +01:00
|
|
|
|
|
|
|
$ids = array_keys( $to_display );
|
|
|
|
_prime_post_caches( $ids );
|
|
|
|
|
|
|
|
if ( ! isset( $GLOBALS['post'] ) ) {
|
2015-03-20 02:57:27 +01:00
|
|
|
$GLOBALS['post'] = reset( $ids );
|
2015-03-11 21:46:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
foreach ( $to_display as $page_id => $level ) {
|
|
|
|
echo "\t";
|
|
|
|
$this->single_row( $page_id, $level );
|
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Given a top level page ID, display the nested hierarchy of sub-pages
|
|
|
|
* together with paging support
|
|
|
|
*
|
2010-12-01 20:24:38 +01:00
|
|
|
* @since 3.1.0 (Standalone function exists since 2.6.0)
|
2015-03-11 21:46:27 +01:00
|
|
|
* @since 4.2.0 Added the `$to_display` parameter.
|
2010-10-25 02:12:41 +02:00
|
|
|
*
|
2013-08-06 00:10:03 +02:00
|
|
|
* @param array $children_pages
|
2020-07-23 22:01:04 +02:00
|
|
|
* @param int $count
|
|
|
|
* @param int $parent
|
|
|
|
* @param int $level
|
|
|
|
* @param int $pagenum
|
|
|
|
* @param int $per_page
|
2015-04-04 18:04:28 +02:00
|
|
|
* @param array $to_display List of pages to be displayed. Passed by reference.
|
2010-10-25 02:12:41 +02:00
|
|
|
*/
|
2015-03-11 21:46:27 +01:00
|
|
|
private function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page, &$to_display ) {
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( ! isset( $children_pages[ $parent ] ) ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
return;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
$start = ( $pagenum - 1 ) * $per_page;
|
2017-12-01 00:11:00 +01:00
|
|
|
$end = $start + $per_page;
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
foreach ( $children_pages[ $parent ] as $page ) {
|
|
|
|
if ( $count >= $end ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
break;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
// If the page starts in a subtree, print the parents.
|
2021-05-03 15:57:04 +02:00
|
|
|
if ( $count === $start && $page->post_parent > 0 ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
$my_parents = array();
|
2017-12-01 00:11:00 +01:00
|
|
|
$my_parent = $page->post_parent;
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
while ( $my_parent ) {
|
2020-01-29 01:45:18 +01:00
|
|
|
// Get the ID from the list or the attribute if my_parent is an object.
|
2015-03-11 21:46:27 +01:00
|
|
|
$parent_id = $my_parent;
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2015-03-11 21:46:27 +01:00
|
|
|
if ( is_object( $my_parent ) ) {
|
|
|
|
$parent_id = $my_parent->ID;
|
|
|
|
}
|
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
$my_parent = get_post( $parent_id );
|
2010-10-25 02:12:41 +02:00
|
|
|
$my_parents[] = $my_parent;
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( ! $my_parent->post_parent ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
break;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
$my_parent = $my_parent->post_parent;
|
|
|
|
}
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
$num_parents = count( $my_parents );
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
while ( $my_parent = array_pop( $my_parents ) ) {
|
2017-12-01 00:11:00 +01:00
|
|
|
$to_display[ $my_parent->ID ] = $level - $num_parents;
|
2010-10-25 02:12:41 +02:00
|
|
|
$num_parents--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-29 03:10:50 +02:00
|
|
|
if ( $count >= $start ) {
|
2017-12-01 00:11:00 +01:00
|
|
|
$to_display[ $page->ID ] = $level;
|
2013-04-29 03:10:50 +02:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
|
|
|
$count++;
|
|
|
|
|
2015-03-11 21:46:27 +01:00
|
|
|
$this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display );
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
unset( $children_pages[ $parent ] ); // Required in order to keep track of orphans.
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2014-12-01 01:33:23 +01:00
|
|
|
/**
|
2015-07-13 19:49:25 +02:00
|
|
|
* Handles the checkbox column output.
|
|
|
|
*
|
2015-06-12 22:18:24 +02:00
|
|
|
* @since 4.3.0
|
Code Modernization: Fix parameter name mismatches for parent/child classes in `WP_List_Table::column_cb()`.
Matches the method signatures of the parent class and each child class.
Why? PHP 8 introduces the ability to pass named arguments to function/method calls. This means the child and parent method signatures (i.e. parameter names) need to match.
For readability:
- `@since` clearly specifies the original parameter name and its new name as well as why the change happened
- in methods longer than a single line, the generic parameter is reassigned to the original parameter restoring it for context for use within the method. An inline comment is added to explain why this reassignment is made.
Follow-up to [15632], [30679], [31210], [32740], [32753], [32754], [32755], [32756], [32757].
Props jrf, hellofromTonya, sergeybiryukov, azaozz, desrosj, johnbillion.
See #51553.
Built from https://develop.svn.wordpress.org/trunk@51735
git-svn-id: http://core.svn.wordpress.org/trunk@51343 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-09-07 20:19:56 +02:00
|
|
|
* @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
|
2015-05-28 23:41:30 +02:00
|
|
|
*
|
Code Modernization: Fix parameter name mismatches for parent/child classes in `WP_List_Table::column_cb()`.
Matches the method signatures of the parent class and each child class.
Why? PHP 8 introduces the ability to pass named arguments to function/method calls. This means the child and parent method signatures (i.e. parameter names) need to match.
For readability:
- `@since` clearly specifies the original parameter name and its new name as well as why the change happened
- in methods longer than a single line, the generic parameter is reassigned to the original parameter restoring it for context for use within the method. An inline comment is added to explain why this reassignment is made.
Follow-up to [15632], [30679], [31210], [32740], [32753], [32754], [32755], [32756], [32757].
Props jrf, hellofromTonya, sergeybiryukov, azaozz, desrosj, johnbillion.
See #51553.
Built from https://develop.svn.wordpress.org/trunk@51735
git-svn-id: http://core.svn.wordpress.org/trunk@51343 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-09-07 20:19:56 +02:00
|
|
|
* @param WP_Post $item The current WP_Post object.
|
2014-12-01 01:33:23 +01:00
|
|
|
*/
|
Code Modernization: Fix parameter name mismatches for parent/child classes in `WP_List_Table::column_cb()`.
Matches the method signatures of the parent class and each child class.
Why? PHP 8 introduces the ability to pass named arguments to function/method calls. This means the child and parent method signatures (i.e. parameter names) need to match.
For readability:
- `@since` clearly specifies the original parameter name and its new name as well as why the change happened
- in methods longer than a single line, the generic parameter is reassigned to the original parameter restoring it for context for use within the method. An inline comment is added to explain why this reassignment is made.
Follow-up to [15632], [30679], [31210], [32740], [32753], [32754], [32755], [32756], [32757].
Props jrf, hellofromTonya, sergeybiryukov, azaozz, desrosj, johnbillion.
See #51553.
Built from https://develop.svn.wordpress.org/trunk@51735
git-svn-id: http://core.svn.wordpress.org/trunk@51343 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-09-07 20:19:56 +02:00
|
|
|
public function column_cb( $item ) {
|
|
|
|
// Restores the more descriptive, specific name for use within this method.
|
|
|
|
$post = $item;
|
2021-01-08 18:18:07 +01:00
|
|
|
$show = current_user_can( 'edit_post', $post->ID );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Filters whether to show the bulk edit checkbox for a post in its list table.
|
|
|
|
*
|
|
|
|
* By default the checkbox is only shown if the current user can edit the post.
|
|
|
|
*
|
|
|
|
* @since 5.7.0
|
|
|
|
*
|
|
|
|
* @param bool $show Whether to show the checkbox.
|
|
|
|
* @param WP_Post $post The current WP_Post object.
|
|
|
|
*/
|
|
|
|
if ( apply_filters( 'wp_list_table_show_post_checkbox', $show, $post ) ) :
|
2018-08-17 03:51:36 +02:00
|
|
|
?>
|
2017-12-01 00:11:00 +01:00
|
|
|
<label class="screen-reader-text" for="cb-select-<?php the_ID(); ?>">
|
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 19:13:59 +02:00
|
|
|
<?php
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Post title. */
|
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 19:13:59 +02:00
|
|
|
printf( __( 'Select %s' ), _draft_or_post_title() );
|
|
|
|
?>
|
2017-12-01 00:11:00 +01:00
|
|
|
</label>
|
2015-06-12 22:18:24 +02:00
|
|
|
<input id="cb-select-<?php the_ID(); ?>" type="checkbox" name="post[]" value="<?php the_ID(); ?>" />
|
2016-10-26 19:59:29 +02:00
|
|
|
<div class="locked-indicator">
|
|
|
|
<span class="locked-indicator-icon" aria-hidden="true"></span>
|
2017-12-01 00:11:00 +01:00
|
|
|
<span class="screen-reader-text">
|
|
|
|
<?php
|
2016-10-26 19:59:29 +02:00
|
|
|
printf(
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Post title. */
|
2016-10-26 19:59:29 +02:00
|
|
|
__( '“%s” is locked' ),
|
|
|
|
_draft_or_post_title()
|
|
|
|
);
|
2017-12-01 00:11:00 +01:00
|
|
|
?>
|
|
|
|
</span>
|
2016-10-26 19:59:29 +02:00
|
|
|
</div>
|
2018-08-17 03:51:36 +02:00
|
|
|
<?php
|
2017-12-01 00:11:00 +01:00
|
|
|
endif;
|
2015-06-12 22:18:24 +02:00
|
|
|
}
|
|
|
|
|
2015-07-14 19:47:24 +02:00
|
|
|
/**
|
|
|
|
* @since 4.3.0
|
|
|
|
*
|
|
|
|
* @param WP_Post $post
|
|
|
|
* @param string $classes
|
|
|
|
* @param string $data
|
|
|
|
* @param string $primary
|
|
|
|
*/
|
|
|
|
protected function _column_title( $post, $classes, $data, $primary ) {
|
|
|
|
echo '<td class="' . $classes . ' page-title" ', $data, '>';
|
|
|
|
echo $this->column_title( $post );
|
|
|
|
echo $this->handle_row_actions( $post, 'title', $primary );
|
|
|
|
echo '</td>';
|
|
|
|
}
|
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
/**
|
2015-07-13 19:49:25 +02:00
|
|
|
* Handles the title column output.
|
|
|
|
*
|
2015-06-12 22:18:24 +02:00
|
|
|
* @since 4.3.0
|
|
|
|
*
|
2017-03-22 04:47:07 +01:00
|
|
|
* @global string $mode List table view mode.
|
2015-06-12 22:18:24 +02:00
|
|
|
*
|
2015-07-13 19:49:25 +02:00
|
|
|
* @param WP_Post $post The current WP_Post object.
|
2015-06-12 22:18:24 +02:00
|
|
|
*/
|
|
|
|
public function column_title( $post ) {
|
2012-09-04 18:29:28 +02:00
|
|
|
global $mode;
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
if ( $this->hierarchical_display ) {
|
|
|
|
if ( 0 === $this->current_level && (int) $post->post_parent > 0 ) {
|
|
|
|
// Sent level 0 by accident, by default, or because we don't know the actual level.
|
|
|
|
$find_main_page = (int) $post->post_parent;
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
while ( $find_main_page > 0 ) {
|
|
|
|
$parent = get_post( $find_main_page );
|
2015-03-11 21:46:27 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
if ( is_null( $parent ) ) {
|
|
|
|
break;
|
|
|
|
}
|
2015-03-11 21:46:27 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
$this->current_level++;
|
|
|
|
$find_main_page = (int) $parent->post_parent;
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
if ( ! isset( $parent_name ) ) {
|
|
|
|
/** This filter is documented in wp-includes/post-template.php */
|
|
|
|
$parent_name = apply_filters( 'the_title', $parent->post_title, $parent->ID );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-09-18 23:11:28 +02:00
|
|
|
|
2016-10-26 19:59:29 +02:00
|
|
|
$can_edit_post = current_user_can( 'edit_post', $post->ID );
|
|
|
|
|
2020-02-09 17:55:09 +01:00
|
|
|
if ( $can_edit_post && 'trash' !== $post->post_status ) {
|
2016-10-26 19:59:29 +02:00
|
|
|
$lock_holder = wp_check_post_lock( $post->ID );
|
|
|
|
|
|
|
|
if ( $lock_holder ) {
|
2017-12-01 00:11:00 +01:00
|
|
|
$lock_holder = get_userdata( $lock_holder );
|
2016-10-26 19:59:29 +02:00
|
|
|
$locked_avatar = get_avatar( $lock_holder->ID, 18 );
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: User's display name. */
|
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 19:13:59 +02:00
|
|
|
$locked_text = esc_html( sprintf( __( '%s is currently editing' ), $lock_holder->display_name ) );
|
2016-10-26 19:59:29 +02:00
|
|
|
} else {
|
2019-07-01 14:52:01 +02:00
|
|
|
$locked_avatar = '';
|
|
|
|
$locked_text = '';
|
2016-10-26 19:59:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
echo '<div class="locked-info"><span class="locked-avatar">' . $locked_avatar . '</span> <span class="locked-text">' . $locked_text . "</span></div>\n";
|
|
|
|
}
|
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
$pad = str_repeat( '— ', $this->current_level );
|
2017-12-01 00:11:00 +01:00
|
|
|
echo '<strong>';
|
2013-02-02 02:31:06 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
$title = _draft_or_post_title();
|
|
|
|
|
2020-02-09 17:55:09 +01:00
|
|
|
if ( $can_edit_post && 'trash' !== $post->post_status ) {
|
2016-01-17 16:47:26 +01:00
|
|
|
printf(
|
2019-04-08 08:04:50 +02:00
|
|
|
'<a class="row-title" href="%s" aria-label="%s">%s%s</a>',
|
2016-01-17 16:47:26 +01:00
|
|
|
get_edit_post_link( $post->ID ),
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Post title. */
|
2016-01-17 16:47:26 +01:00
|
|
|
esc_attr( sprintf( __( '“%s” (Edit)' ), $title ) ),
|
|
|
|
$pad,
|
|
|
|
$title
|
|
|
|
);
|
2013-11-17 21:40:09 +01:00
|
|
|
} else {
|
2019-03-21 16:32:01 +01:00
|
|
|
printf(
|
2019-04-08 08:04:50 +02:00
|
|
|
'<span>%s%s</span>',
|
2019-03-21 16:32:01 +01:00
|
|
|
$pad,
|
|
|
|
$title
|
|
|
|
);
|
2013-11-17 21:40:09 +01:00
|
|
|
}
|
2015-06-12 22:18:24 +02:00
|
|
|
_post_states( $post );
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
if ( isset( $parent_name ) ) {
|
|
|
|
$post_type_object = get_post_type_object( $post->post_type );
|
|
|
|
echo ' | ' . $post_type_object->labels->parent_item_colon . ' ' . esc_html( $parent_name );
|
|
|
|
}
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
echo "</strong>\n";
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-07-12 13:36:04 +02:00
|
|
|
if ( 'excerpt' === $mode
|
|
|
|
&& ! is_post_type_hierarchical( $this->screen->post_type )
|
|
|
|
&& current_user_can( 'read_post', $post->ID )
|
|
|
|
) {
|
2017-10-05 04:50:46 +02:00
|
|
|
if ( post_password_required( $post ) ) {
|
|
|
|
echo '<span class="protected-post-excerpt">' . esc_html( get_the_excerpt() ) . '</span>';
|
|
|
|
} else {
|
|
|
|
echo esc_html( get_the_excerpt() );
|
|
|
|
}
|
2015-06-12 22:18:24 +02:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
get_inline_data( $post );
|
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
/**
|
2015-07-13 19:49:25 +02:00
|
|
|
* Handles the post date column output.
|
|
|
|
*
|
2015-06-12 22:18:24 +02:00
|
|
|
* @since 4.3.0
|
|
|
|
*
|
2017-03-22 04:47:07 +01:00
|
|
|
* @global string $mode List table view mode.
|
2015-06-12 22:18:24 +02:00
|
|
|
*
|
2015-07-13 19:49:25 +02:00
|
|
|
* @param WP_Post $post The current WP_Post object.
|
2015-06-12 22:18:24 +02:00
|
|
|
*/
|
|
|
|
public function column_date( $post ) {
|
|
|
|
global $mode;
|
2015-06-10 16:01:28 +02:00
|
|
|
|
2015-09-22 08:06:25 +02:00
|
|
|
if ( '0000-00-00 00:00:00' === $post->post_date ) {
|
2019-07-01 14:52:01 +02:00
|
|
|
$t_time = __( 'Unpublished' );
|
2015-06-12 22:18:24 +02:00
|
|
|
$time_diff = 0;
|
|
|
|
} else {
|
2020-06-01 21:15:08 +02:00
|
|
|
$t_time = sprintf(
|
|
|
|
/* translators: 1: Post date, 2: Post time. */
|
|
|
|
__( '%1$s at %2$s' ),
|
2020-09-18 12:37:08 +02:00
|
|
|
/* translators: Post date format. See https://www.php.net/manual/datetime.format.php */
|
2020-06-01 21:15:08 +02:00
|
|
|
get_the_time( __( 'Y/m/d' ), $post ),
|
2020-09-18 12:37:08 +02:00
|
|
|
/* translators: Post time format. See https://www.php.net/manual/datetime.format.php */
|
2020-06-01 21:15:08 +02:00
|
|
|
get_the_time( __( 'g:i a' ), $post )
|
|
|
|
);
|
|
|
|
|
2019-10-25 14:51:03 +02:00
|
|
|
$time = get_post_timestamp( $post );
|
2015-06-12 22:18:24 +02:00
|
|
|
$time_diff = time() - $time;
|
|
|
|
}
|
2015-06-10 16:01:28 +02:00
|
|
|
|
2015-09-22 08:06:25 +02:00
|
|
|
if ( 'publish' === $post->post_status ) {
|
2017-04-01 16:07:44 +02:00
|
|
|
$status = __( 'Published' );
|
2015-09-22 08:06:25 +02:00
|
|
|
} elseif ( 'future' === $post->post_status ) {
|
2015-09-10 19:43:24 +02:00
|
|
|
if ( $time_diff > 0 ) {
|
2017-04-01 16:07:44 +02:00
|
|
|
$status = '<strong class="error-message">' . __( 'Missed schedule' ) . '</strong>';
|
2015-09-10 19:43:24 +02:00
|
|
|
} else {
|
2017-04-01 16:07:44 +02:00
|
|
|
$status = __( 'Scheduled' );
|
2015-09-10 19:43:24 +02:00
|
|
|
}
|
|
|
|
} else {
|
2017-04-01 16:07:44 +02:00
|
|
|
$status = __( 'Last Modified' );
|
2015-09-10 19:43:24 +02:00
|
|
|
}
|
2017-04-01 16:07:44 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Filters the status text of the post.
|
|
|
|
*
|
|
|
|
* @since 4.8.0
|
|
|
|
*
|
|
|
|
* @param string $status The status text.
|
|
|
|
* @param WP_Post $post Post object.
|
|
|
|
* @param string $column_name The column name.
|
2020-07-12 13:36:04 +02:00
|
|
|
* @param string $mode The list display mode ('excerpt' or 'list').
|
2017-04-01 16:07:44 +02:00
|
|
|
*/
|
|
|
|
$status = apply_filters( 'post_date_column_status', $status, $post, 'date', $mode );
|
|
|
|
|
|
|
|
if ( $status ) {
|
|
|
|
echo $status . '<br />';
|
|
|
|
}
|
|
|
|
|
2020-06-01 21:15:08 +02:00
|
|
|
/**
|
|
|
|
* Filters the published time of the post.
|
|
|
|
*
|
|
|
|
* @since 2.5.1
|
|
|
|
* @since 5.5.0 Removed the difference between 'excerpt' and 'list' modes.
|
|
|
|
* The published time and date are both displayed now,
|
|
|
|
* which is equivalent to the previous 'excerpt' mode.
|
|
|
|
*
|
|
|
|
* @param string $t_time The published time.
|
|
|
|
* @param WP_Post $post Post object.
|
|
|
|
* @param string $column_name The column name.
|
2020-07-12 13:36:04 +02:00
|
|
|
* @param string $mode The list display mode ('excerpt' or 'list').
|
2020-06-01 21:15:08 +02:00
|
|
|
*/
|
|
|
|
echo apply_filters( 'post_date_column_time', $t_time, $post, 'date', $mode );
|
2015-06-12 22:18:24 +02:00
|
|
|
}
|
2013-03-21 04:23:39 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
/**
|
2015-07-13 19:49:25 +02:00
|
|
|
* Handles the comments column output.
|
|
|
|
*
|
2015-06-12 22:18:24 +02:00
|
|
|
* @since 4.3.0
|
|
|
|
*
|
2015-07-13 19:49:25 +02:00
|
|
|
* @param WP_Post $post The current WP_Post object.
|
2015-06-12 22:18:24 +02:00
|
|
|
*/
|
|
|
|
public function column_comments( $post ) {
|
|
|
|
?>
|
|
|
|
<div class="post-com-count-wrapper">
|
|
|
|
<?php
|
2017-12-01 00:11:00 +01:00
|
|
|
$pending_comments = isset( $this->comment_pending_count[ $post->ID ] ) ? $this->comment_pending_count[ $post->ID ] : 0;
|
2015-06-12 22:18:24 +02:00
|
|
|
|
|
|
|
$this->comments_bubble( $post->ID, $pending_comments );
|
|
|
|
?>
|
|
|
|
</div>
|
|
|
|
<?php
|
|
|
|
}
|
2013-03-21 04:23:39 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
/**
|
2015-07-13 19:49:25 +02:00
|
|
|
* Handles the post author column output.
|
|
|
|
*
|
2015-06-12 22:18:24 +02:00
|
|
|
* @since 4.3.0
|
|
|
|
*
|
2015-07-13 19:49:25 +02:00
|
|
|
* @param WP_Post $post The current WP_Post object.
|
2015-06-12 22:18:24 +02:00
|
|
|
*/
|
|
|
|
public function column_author( $post ) {
|
2015-09-12 19:13:25 +02:00
|
|
|
$args = array(
|
|
|
|
'post_type' => $post->post_type,
|
2017-12-01 00:11:00 +01:00
|
|
|
'author' => get_the_author_meta( 'ID' ),
|
2015-06-12 22:18:24 +02:00
|
|
|
);
|
2015-09-12 19:13:25 +02:00
|
|
|
echo $this->get_edit_link( $args, get_the_author() );
|
2015-06-12 22:18:24 +02:00
|
|
|
}
|
2013-03-21 04:23:39 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
/**
|
2015-07-13 19:49:25 +02:00
|
|
|
* Handles the default column output.
|
|
|
|
*
|
2015-06-12 22:18:24 +02:00
|
|
|
* @since 4.3.0
|
2021-09-07 18:57:58 +02:00
|
|
|
* @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
|
2015-06-12 22:18:24 +02:00
|
|
|
*
|
Code Modernization: Fix parameter name mismatches for parent/child classes in `WP_List_Table::column_default()`.
Matches the method signatures of the parent class and each child class.
Why? PHP 8 introduces the ability to pass named arguments to function/method calls. This means the child and parent method signatures (i.e. parameter names) need to match.
For readability:
- `@since` clearly specifies the original parameter name and its new name as well as why the change happened
- in methods longer than a single line, the generic parameter is reassigned to the original parameter restoring it for context for use within the method. An inline comment is added to explain why this reassignment is made.
Follow-up to [15632], [30679], [31210], [32740], [32753], [32754], [32755], [32756], [32757].
Props jrf, hellofromTonya, @sergeybiryukov, @azaozz, @desrosj, @johnbillion
See #51553.
Built from https://develop.svn.wordpress.org/trunk@51728
git-svn-id: http://core.svn.wordpress.org/trunk@51334 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-09-03 00:26:56 +02:00
|
|
|
* @param WP_Post $item The current WP_Post object.
|
2015-07-13 19:49:25 +02:00
|
|
|
* @param string $column_name The current column name.
|
2015-06-12 22:18:24 +02:00
|
|
|
*/
|
Code Modernization: Fix parameter name mismatches for parent/child classes in `WP_List_Table::column_default()`.
Matches the method signatures of the parent class and each child class.
Why? PHP 8 introduces the ability to pass named arguments to function/method calls. This means the child and parent method signatures (i.e. parameter names) need to match.
For readability:
- `@since` clearly specifies the original parameter name and its new name as well as why the change happened
- in methods longer than a single line, the generic parameter is reassigned to the original parameter restoring it for context for use within the method. An inline comment is added to explain why this reassignment is made.
Follow-up to [15632], [30679], [31210], [32740], [32753], [32754], [32755], [32756], [32757].
Props jrf, hellofromTonya, @sergeybiryukov, @azaozz, @desrosj, @johnbillion
See #51553.
Built from https://develop.svn.wordpress.org/trunk@51728
git-svn-id: http://core.svn.wordpress.org/trunk@51334 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-09-03 00:26:56 +02:00
|
|
|
public function column_default( $item, $column_name ) {
|
|
|
|
// Restores the more descriptive, specific name for use within this method.
|
|
|
|
$post = $item;
|
|
|
|
|
2015-09-22 08:06:25 +02:00
|
|
|
if ( 'categories' === $column_name ) {
|
2015-06-12 22:18:24 +02:00
|
|
|
$taxonomy = 'category';
|
2015-09-22 08:06:25 +02:00
|
|
|
} elseif ( 'tags' === $column_name ) {
|
2015-06-12 22:18:24 +02:00
|
|
|
$taxonomy = 'post_tag';
|
|
|
|
} elseif ( 0 === strpos( $column_name, 'taxonomy-' ) ) {
|
|
|
|
$taxonomy = substr( $column_name, 9 );
|
|
|
|
} else {
|
|
|
|
$taxonomy = false;
|
|
|
|
}
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
if ( $taxonomy ) {
|
|
|
|
$taxonomy_object = get_taxonomy( $taxonomy );
|
2017-12-01 00:11:00 +01:00
|
|
|
$terms = get_the_terms( $post->ID, $taxonomy );
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
if ( is_array( $terms ) ) {
|
2019-03-08 16:37:52 +01:00
|
|
|
$term_links = array();
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
foreach ( $terms as $t ) {
|
|
|
|
$posts_in_term_qv = array();
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2020-05-16 20:42:12 +02:00
|
|
|
if ( 'post' !== $post->post_type ) {
|
2015-06-12 22:18:24 +02:00
|
|
|
$posts_in_term_qv['post_type'] = $post->post_type;
|
|
|
|
}
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
if ( $taxonomy_object->query_var ) {
|
|
|
|
$posts_in_term_qv[ $taxonomy_object->query_var ] = $t->slug;
|
2015-06-10 16:01:28 +02:00
|
|
|
} else {
|
2015-06-12 22:18:24 +02:00
|
|
|
$posts_in_term_qv['taxonomy'] = $taxonomy;
|
2017-12-01 00:11:00 +01:00
|
|
|
$posts_in_term_qv['term'] = $t->slug;
|
2015-06-10 16:01:28 +02:00
|
|
|
}
|
2012-09-04 18:29:28 +02:00
|
|
|
|
2015-09-12 19:13:25 +02:00
|
|
|
$label = esc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) );
|
2019-03-08 16:37:52 +01:00
|
|
|
|
|
|
|
$term_links[] = $this->get_edit_link( $posts_in_term_qv, $label );
|
2015-06-12 22:18:24 +02:00
|
|
|
}
|
2019-03-08 16:37:52 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Filters the links in `$taxonomy` column of edit.php.
|
|
|
|
*
|
|
|
|
* @since 5.2.0
|
|
|
|
*
|
2019-10-26 23:09:04 +02:00
|
|
|
* @param string[] $term_links Array of term editing links.
|
|
|
|
* @param string $taxonomy Taxonomy name.
|
|
|
|
* @param WP_Term[] $terms Array of term objects appearing in the post row.
|
2019-03-08 16:37:52 +01:00
|
|
|
*/
|
|
|
|
$term_links = apply_filters( 'post_column_taxonomy_links', $term_links, $taxonomy, $terms );
|
|
|
|
|
2022-03-13 21:03:01 +01:00
|
|
|
echo implode( wp_get_list_item_separator(), $term_links );
|
2015-06-12 22:18:24 +02:00
|
|
|
} else {
|
2015-06-25 02:16:27 +02:00
|
|
|
echo '<span aria-hidden="true">—</span><span class="screen-reader-text">' . $taxonomy_object->labels->no_terms . '</span>';
|
2015-06-12 22:18:24 +02:00
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
2013-02-02 02:31:06 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
if ( is_post_type_hierarchical( $post->post_type ) ) {
|
2013-02-02 02:31:06 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
/**
|
|
|
|
* Fires in each custom column on the Posts list table.
|
|
|
|
*
|
|
|
|
* This hook only fires if the current post type is hierarchical,
|
|
|
|
* such as pages.
|
|
|
|
*
|
|
|
|
* @since 2.5.0
|
|
|
|
*
|
|
|
|
* @param string $column_name The name of the column to display.
|
|
|
|
* @param int $post_id The current post ID.
|
|
|
|
*/
|
|
|
|
do_action( 'manage_pages_custom_column', $column_name, $post->ID );
|
|
|
|
} else {
|
2015-06-10 16:01:28 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
/**
|
|
|
|
* Fires in each custom column in the Posts list table.
|
|
|
|
*
|
|
|
|
* This hook only fires if the current post type is non-hierarchical,
|
|
|
|
* such as posts.
|
|
|
|
*
|
|
|
|
* @since 1.5.0
|
|
|
|
*
|
|
|
|
* @param string $column_name The name of the column to display.
|
|
|
|
* @param int $post_id The current post ID.
|
|
|
|
*/
|
|
|
|
do_action( 'manage_posts_custom_column', $column_name, $post->ID );
|
|
|
|
}
|
2013-03-13 01:28:07 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
/**
|
|
|
|
* Fires for each custom column of a specific post type in the Posts list table.
|
|
|
|
*
|
|
|
|
* The dynamic portion of the hook name, `$post->post_type`, refers to the post type.
|
|
|
|
*
|
2021-03-07 13:32:09 +01:00
|
|
|
* Possible hook names include:
|
|
|
|
*
|
|
|
|
* - `manage_post_posts_custom_column`
|
|
|
|
* - `manage_page_posts_custom_column`
|
|
|
|
*
|
2015-06-12 22:18:24 +02:00
|
|
|
* @since 3.1.0
|
|
|
|
*
|
|
|
|
* @param string $column_name The name of the column to display.
|
|
|
|
* @param int $post_id The current post ID.
|
|
|
|
*/
|
|
|
|
do_action( "manage_{$post->post_type}_posts_custom_column", $column_name, $post->ID );
|
|
|
|
}
|
2013-02-02 02:31:06 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
/**
|
2019-08-04 14:28:56 +02:00
|
|
|
* @global WP_Post $post Global post object.
|
2015-06-12 22:18:24 +02:00
|
|
|
*
|
|
|
|
* @param int|WP_Post $post
|
|
|
|
* @param int $level
|
|
|
|
*/
|
|
|
|
public function single_row( $post, $level = 0 ) {
|
|
|
|
$global_post = get_post();
|
2015-06-10 16:01:28 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
$post = get_post( $post );
|
2015-06-12 22:18:24 +02:00
|
|
|
$this->current_level = $level;
|
2014-02-25 07:12:13 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
$GLOBALS['post'] = $post;
|
|
|
|
setup_postdata( $post );
|
2015-06-10 16:01:28 +02:00
|
|
|
|
2021-05-03 15:57:04 +02:00
|
|
|
$classes = 'iedit author-' . ( get_current_user_id() === (int) $post->post_author ? 'self' : 'other' );
|
2014-02-25 07:12:13 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
$lock_holder = wp_check_post_lock( $post->ID );
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
if ( $lock_holder ) {
|
|
|
|
$classes .= ' wp-locked';
|
|
|
|
}
|
2014-02-25 07:12:13 +01:00
|
|
|
|
2015-06-12 22:18:24 +02:00
|
|
|
if ( $post->post_parent ) {
|
2017-12-01 00:11:00 +01:00
|
|
|
$count = count( get_post_ancestors( $post->ID ) );
|
|
|
|
$classes .= ' level-' . $count;
|
2015-06-12 22:18:24 +02:00
|
|
|
} else {
|
2017-12-01 00:11:00 +01:00
|
|
|
$classes .= ' level-0';
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
2018-08-17 03:51:36 +02:00
|
|
|
?>
|
2015-06-12 22:18:24 +02:00
|
|
|
<tr id="post-<?php echo $post->ID; ?>" class="<?php echo implode( ' ', get_post_class( $classes, $post->ID ) ); ?>">
|
|
|
|
<?php $this->single_row_columns( $post ); ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
</tr>
|
2018-08-17 03:51:36 +02:00
|
|
|
<?php
|
2012-09-04 18:29:28 +02:00
|
|
|
$GLOBALS['post'] = $global_post;
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2015-05-29 04:41:25 +02:00
|
|
|
/**
|
2015-07-13 19:49:25 +02:00
|
|
|
* Gets the name of the default primary column.
|
2015-05-29 04:41:25 +02:00
|
|
|
*
|
|
|
|
* @since 4.3.0
|
|
|
|
*
|
2015-05-31 03:42:25 +02:00
|
|
|
* @return string Name of the default primary column, in this case, 'title'.
|
2015-05-29 04:41:25 +02:00
|
|
|
*/
|
|
|
|
protected function get_default_primary_column_name() {
|
2015-07-14 18:18:25 +02:00
|
|
|
return 'title';
|
2015-05-29 04:41:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2015-07-13 19:49:25 +02:00
|
|
|
* Generates and displays row action links.
|
2015-05-29 04:41:25 +02:00
|
|
|
*
|
|
|
|
* @since 4.3.0
|
Code Modernization: Fix parameter name mismatches for parent/child classes in `WP_List_Table::handle_row_actions()`.
Matches the method signatures of the parent class and each child class.
Why? PHP 8 introduces the ability to pass named arguments to function/method calls. This means the child and parent method signatures (i.e. parameter names) need to match.
For readability:
- `@since` clearly specifies the original parameter name and its new name as well as why the change happened
- in methods longer than a single line, the generic parameter is reassigned to the original parameter restoring it for context for use within the method. An inline comment is added to explain why this reassignment is made.
Follow-up to [32644], [32664], [32798], [38489], [49183], [49197].
Props jrf, hellofromTonya, sergeybiryukov, azaozz, desrosj, johnbillion.
See #51553.
Built from https://develop.svn.wordpress.org/trunk@51737
git-svn-id: http://core.svn.wordpress.org/trunk@51345 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-09-07 21:24:53 +02:00
|
|
|
* @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support.
|
2015-05-29 04:41:25 +02:00
|
|
|
*
|
Code Modernization: Fix parameter name mismatches for parent/child classes in `WP_List_Table::handle_row_actions()`.
Matches the method signatures of the parent class and each child class.
Why? PHP 8 introduces the ability to pass named arguments to function/method calls. This means the child and parent method signatures (i.e. parameter names) need to match.
For readability:
- `@since` clearly specifies the original parameter name and its new name as well as why the change happened
- in methods longer than a single line, the generic parameter is reassigned to the original parameter restoring it for context for use within the method. An inline comment is added to explain why this reassignment is made.
Follow-up to [32644], [32664], [32798], [38489], [49183], [49197].
Props jrf, hellofromTonya, sergeybiryukov, azaozz, desrosj, johnbillion.
See #51553.
Built from https://develop.svn.wordpress.org/trunk@51737
git-svn-id: http://core.svn.wordpress.org/trunk@51345 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-09-07 21:24:53 +02:00
|
|
|
* @param WP_Post $item Post being acted upon.
|
2020-10-17 18:05:09 +02:00
|
|
|
* @param string $column_name Current column name.
|
|
|
|
* @param string $primary Primary column name.
|
2020-01-11 18:59:04 +01:00
|
|
|
* @return string Row actions output for posts, or an empty string
|
|
|
|
* if the current column is not the primary column.
|
2015-05-29 04:41:25 +02:00
|
|
|
*/
|
Code Modernization: Fix parameter name mismatches for parent/child classes in `WP_List_Table::handle_row_actions()`.
Matches the method signatures of the parent class and each child class.
Why? PHP 8 introduces the ability to pass named arguments to function/method calls. This means the child and parent method signatures (i.e. parameter names) need to match.
For readability:
- `@since` clearly specifies the original parameter name and its new name as well as why the change happened
- in methods longer than a single line, the generic parameter is reassigned to the original parameter restoring it for context for use within the method. An inline comment is added to explain why this reassignment is made.
Follow-up to [32644], [32664], [32798], [38489], [49183], [49197].
Props jrf, hellofromTonya, sergeybiryukov, azaozz, desrosj, johnbillion.
See #51553.
Built from https://develop.svn.wordpress.org/trunk@51737
git-svn-id: http://core.svn.wordpress.org/trunk@51345 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-09-07 21:24:53 +02:00
|
|
|
protected function handle_row_actions( $item, $column_name, $primary ) {
|
2015-07-14 19:47:24 +02:00
|
|
|
if ( $primary !== $column_name ) {
|
|
|
|
return '';
|
|
|
|
}
|
2015-05-29 04:41:25 +02:00
|
|
|
|
Code Modernization: Fix parameter name mismatches for parent/child classes in `WP_List_Table::handle_row_actions()`.
Matches the method signatures of the parent class and each child class.
Why? PHP 8 introduces the ability to pass named arguments to function/method calls. This means the child and parent method signatures (i.e. parameter names) need to match.
For readability:
- `@since` clearly specifies the original parameter name and its new name as well as why the change happened
- in methods longer than a single line, the generic parameter is reassigned to the original parameter restoring it for context for use within the method. An inline comment is added to explain why this reassignment is made.
Follow-up to [32644], [32664], [32798], [38489], [49183], [49197].
Props jrf, hellofromTonya, sergeybiryukov, azaozz, desrosj, johnbillion.
See #51553.
Built from https://develop.svn.wordpress.org/trunk@51737
git-svn-id: http://core.svn.wordpress.org/trunk@51345 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-09-07 21:24:53 +02:00
|
|
|
// Restores the more descriptive, specific name for use within this method.
|
|
|
|
$post = $item;
|
2015-07-14 19:47:24 +02:00
|
|
|
$post_type_object = get_post_type_object( $post->post_type );
|
2017-12-01 00:11:00 +01:00
|
|
|
$can_edit_post = current_user_can( 'edit_post', $post->ID );
|
|
|
|
$actions = array();
|
|
|
|
$title = _draft_or_post_title();
|
2015-05-29 04:41:25 +02:00
|
|
|
|
2020-05-16 20:42:12 +02:00
|
|
|
if ( $can_edit_post && 'trash' !== $post->post_status ) {
|
2016-01-17 16:47:26 +01:00
|
|
|
$actions['edit'] = sprintf(
|
|
|
|
'<a href="%s" aria-label="%s">%s</a>',
|
|
|
|
get_edit_post_link( $post->ID ),
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Post title. */
|
2016-01-17 16:47:26 +01:00
|
|
|
esc_attr( sprintf( __( 'Edit “%s”' ), $title ) ),
|
|
|
|
__( 'Edit' )
|
|
|
|
);
|
2018-12-17 04:01:05 +01:00
|
|
|
|
|
|
|
if ( 'wp_block' !== $post->post_type ) {
|
|
|
|
$actions['inline hide-if-no-js'] = sprintf(
|
|
|
|
'<button type="button" class="button-link editinline" aria-label="%s" aria-expanded="false">%s</button>',
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Post title. */
|
2018-12-17 04:01:05 +01:00
|
|
|
esc_attr( sprintf( __( 'Quick edit “%s” inline' ), $title ) ),
|
|
|
|
__( 'Quick Edit' )
|
|
|
|
);
|
|
|
|
}
|
2015-07-14 19:47:24 +02:00
|
|
|
}
|
2015-05-29 04:41:25 +02:00
|
|
|
|
2015-07-14 19:47:24 +02:00
|
|
|
if ( current_user_can( 'delete_post', $post->ID ) ) {
|
2016-01-17 16:47:26 +01:00
|
|
|
if ( 'trash' === $post->post_status ) {
|
|
|
|
$actions['untrash'] = sprintf(
|
|
|
|
'<a href="%s" aria-label="%s">%s</a>',
|
|
|
|
wp_nonce_url( admin_url( sprintf( $post_type_object->_edit_link . '&action=untrash', $post->ID ) ), 'untrash-post_' . $post->ID ),
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Post title. */
|
2016-01-17 17:03:25 +01:00
|
|
|
esc_attr( sprintf( __( 'Restore “%s” from the Trash' ), $title ) ),
|
2016-01-17 16:47:26 +01:00
|
|
|
__( 'Restore' )
|
|
|
|
);
|
|
|
|
} elseif ( EMPTY_TRASH_DAYS ) {
|
|
|
|
$actions['trash'] = sprintf(
|
|
|
|
'<a href="%s" class="submitdelete" aria-label="%s">%s</a>',
|
|
|
|
get_delete_post_link( $post->ID ),
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Post title. */
|
2016-01-17 17:03:25 +01:00
|
|
|
esc_attr( sprintf( __( 'Move “%s” to the Trash' ), $title ) ),
|
2016-01-17 16:47:26 +01:00
|
|
|
_x( 'Trash', 'verb' )
|
|
|
|
);
|
|
|
|
}
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2016-01-17 16:47:26 +01:00
|
|
|
if ( 'trash' === $post->post_status || ! EMPTY_TRASH_DAYS ) {
|
|
|
|
$actions['delete'] = sprintf(
|
|
|
|
'<a href="%s" class="submitdelete" aria-label="%s">%s</a>',
|
|
|
|
get_delete_post_link( $post->ID, '', true ),
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Post title. */
|
2016-01-17 17:03:25 +01:00
|
|
|
esc_attr( sprintf( __( 'Delete “%s” permanently' ), $title ) ),
|
2016-01-17 16:47:26 +01:00
|
|
|
__( 'Delete Permanently' )
|
|
|
|
);
|
|
|
|
}
|
2015-07-14 19:47:24 +02:00
|
|
|
}
|
2015-05-29 04:41:25 +02:00
|
|
|
|
Custom Post Types:
* Introduce `is_post_type_viewable( $post_type_object )`
* Separate the HTML bits from the translatable bits in the `post` messages array in `edit-form-advanced.php`
* Don't show certain UI pieces when a post is not viewable on the front end
When a custom post type item is not viewable on the front end, we don't want to show links to View it (on the front end) all over the admin. We also want to hide the Preview link, et al. We also want our admin messages to not contain said links.
Custom post types with `public_queryable` set to `false` are not viewable on the front end.
`'page'` is viewable on the front end, but `'page'` is a `_builtin` type, and `public_queryable` is set to `false` when it is registered - see `WP::parse_request()` for when `public_queryable` gets used.
This is confusing, but also somewhat straightforward: to determine if a post type is viewable on the front end, we can check one way for `_builtin => true` and another way for `_builtin => false`:
`$post_type->publicly_queryable || ( $post_type->_builtin && $post_type->public )`
If a post type is `publicly_queryable`, it's viewable. If that value is `false`, it is viewable if it's a `_builtin` type that is also `public`.
I am in search of edge cases, so this shall land.
Props wonderboymusic, DrewAPicture.
See #17609.
Built from https://develop.svn.wordpress.org/trunk@33666
git-svn-id: http://core.svn.wordpress.org/trunk@33633 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2015-08-20 21:40:25 +02:00
|
|
|
if ( is_post_type_viewable( $post_type_object ) ) {
|
2020-04-05 05:02:11 +02:00
|
|
|
if ( in_array( $post->post_status, array( 'pending', 'draft', 'future' ), true ) ) {
|
2015-07-14 19:47:24 +02:00
|
|
|
if ( $can_edit_post ) {
|
2017-12-01 00:11:00 +01:00
|
|
|
$preview_link = get_preview_post_link( $post );
|
2016-01-17 16:47:26 +01:00
|
|
|
$actions['view'] = sprintf(
|
2017-05-23 19:58:43 +02:00
|
|
|
'<a href="%s" rel="bookmark" aria-label="%s">%s</a>',
|
2016-01-17 16:47:26 +01:00
|
|
|
esc_url( $preview_link ),
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Post title. */
|
2016-01-17 16:47:26 +01:00
|
|
|
esc_attr( sprintf( __( 'Preview “%s”' ), $title ) ),
|
|
|
|
__( 'Preview' )
|
|
|
|
);
|
2015-05-29 04:41:25 +02:00
|
|
|
}
|
2020-05-16 20:42:12 +02:00
|
|
|
} elseif ( 'trash' !== $post->post_status ) {
|
2016-01-17 16:47:26 +01:00
|
|
|
$actions['view'] = sprintf(
|
2017-05-23 19:58:43 +02:00
|
|
|
'<a href="%s" rel="bookmark" aria-label="%s">%s</a>',
|
2016-01-17 16:47:26 +01:00
|
|
|
get_permalink( $post->ID ),
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Post title. */
|
2016-01-17 16:47:26 +01:00
|
|
|
esc_attr( sprintf( __( 'View “%s”' ), $title ) ),
|
|
|
|
__( 'View' )
|
|
|
|
);
|
2015-05-29 04:41:25 +02:00
|
|
|
}
|
2015-07-14 19:47:24 +02:00
|
|
|
}
|
2015-05-29 04:41:25 +02:00
|
|
|
|
2018-12-17 04:01:05 +01:00
|
|
|
if ( 'wp_block' === $post->post_type ) {
|
|
|
|
$actions['export'] = sprintf(
|
|
|
|
'<button type="button" class="wp-list-reusable-blocks__export button-link" data-id="%s" aria-label="%s">%s</button>',
|
|
|
|
$post->ID,
|
2019-09-03 02:41:05 +02:00
|
|
|
/* translators: %s: Post title. */
|
2018-12-17 04:01:05 +01:00
|
|
|
esc_attr( sprintf( __( 'Export “%s” as JSON' ), $title ) ),
|
|
|
|
__( 'Export as JSON' )
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2015-07-14 19:47:24 +02:00
|
|
|
if ( is_post_type_hierarchical( $post->post_type ) ) {
|
2015-05-29 04:41:25 +02:00
|
|
|
|
2015-07-14 19:47:24 +02:00
|
|
|
/**
|
2016-05-22 20:01:30 +02:00
|
|
|
* Filters the array of row action links on the Pages list table.
|
2015-07-14 19:47:24 +02:00
|
|
|
*
|
|
|
|
* The filter is evaluated only for hierarchical post types.
|
|
|
|
*
|
|
|
|
* @since 2.8.0
|
|
|
|
*
|
2018-03-22 21:27:32 +01:00
|
|
|
* @param string[] $actions An array of row action links. Defaults are
|
|
|
|
* 'Edit', 'Quick Edit', 'Restore', 'Trash',
|
|
|
|
* 'Delete Permanently', 'Preview', and 'View'.
|
|
|
|
* @param WP_Post $post The post object.
|
2015-07-14 19:47:24 +02:00
|
|
|
*/
|
|
|
|
$actions = apply_filters( 'page_row_actions', $actions, $post );
|
|
|
|
} else {
|
2015-05-29 04:41:25 +02:00
|
|
|
|
2015-07-14 19:47:24 +02:00
|
|
|
/**
|
2016-05-22 20:01:30 +02:00
|
|
|
* Filters the array of row action links on the Posts list table.
|
2015-07-14 19:47:24 +02:00
|
|
|
*
|
|
|
|
* The filter is evaluated only for non-hierarchical post types.
|
|
|
|
*
|
|
|
|
* @since 2.8.0
|
|
|
|
*
|
2018-03-22 21:27:32 +01:00
|
|
|
* @param string[] $actions An array of row action links. Defaults are
|
|
|
|
* 'Edit', 'Quick Edit', 'Restore', 'Trash',
|
|
|
|
* 'Delete Permanently', 'Preview', and 'View'.
|
|
|
|
* @param WP_Post $post The post object.
|
2015-07-14 19:47:24 +02:00
|
|
|
*/
|
|
|
|
$actions = apply_filters( 'post_row_actions', $actions, $post );
|
2015-05-29 04:41:25 +02:00
|
|
|
}
|
2015-07-14 19:47:24 +02:00
|
|
|
|
|
|
|
return $this->row_actions( $actions );
|
2015-05-29 04:41:25 +02:00
|
|
|
}
|
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
/**
|
|
|
|
* Outputs the hidden row displayed when inline editing
|
|
|
|
*
|
|
|
|
* @since 3.1.0
|
2015-05-28 23:41:30 +02:00
|
|
|
*
|
2017-03-22 04:47:07 +01:00
|
|
|
* @global string $mode List table view mode.
|
2010-10-25 02:12:41 +02:00
|
|
|
*/
|
Add access modifiers to methods and members of list table classes:
* `WP_List_Table` is the base class that implements `__get()` and `__call()` for BC
* Adds unit tests to confirm that subclasses properly inherit magic methods
* Add modifiers to subclasses: `WP_Links_List_Table`, `WP_Media_List_Table`, `WP_MS_Sites_List_Table`, `WP_MS_Themes_List_Table`, `WP_MS_Users_List_Table`, `WP_Plugin_Install_List_Table`, `WP_Plugins_List_Table`, `WP_Posts_List_Table`, `WP_Terms_List_Table`, `WP_Theme_Install_List_Table`, `WP_Themes_List_Table`
See #27881, #22234.
Built from https://develop.svn.wordpress.org/trunk@28493
git-svn-id: http://core.svn.wordpress.org/trunk@28319 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-05-19 03:17:15 +02:00
|
|
|
public function inline_edit() {
|
2010-10-25 02:12:41 +02:00
|
|
|
global $mode;
|
|
|
|
|
2012-09-19 14:43:31 +02:00
|
|
|
$screen = $this->screen;
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
$post = get_default_post_to_edit( $screen->post_type );
|
2010-10-25 02:12:41 +02:00
|
|
|
$post_type_object = get_post_type_object( $screen->post_type );
|
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
$taxonomy_names = get_object_taxonomies( $screen->post_type );
|
2010-10-25 02:12:41 +02:00
|
|
|
$hierarchical_taxonomies = array();
|
2017-12-01 00:11:00 +01:00
|
|
|
$flat_taxonomies = array();
|
2020-01-29 01:45:18 +01:00
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
foreach ( $taxonomy_names as $taxonomy_name ) {
|
2015-01-30 20:29:22 +01:00
|
|
|
$taxonomy = get_taxonomy( $taxonomy_name );
|
|
|
|
|
|
|
|
$show_in_quick_edit = $taxonomy->show_in_quick_edit;
|
|
|
|
|
2015-01-30 20:18:23 +01:00
|
|
|
/**
|
2016-05-22 20:01:30 +02:00
|
|
|
* Filters whether the current taxonomy should be shown in the Quick Edit panel.
|
2015-01-30 20:18:23 +01:00
|
|
|
*
|
|
|
|
* @since 4.2.0
|
|
|
|
*
|
2015-01-30 20:29:22 +01:00
|
|
|
* @param bool $show_in_quick_edit Whether to show the current taxonomy in Quick Edit.
|
|
|
|
* @param string $taxonomy_name Taxonomy name.
|
|
|
|
* @param string $post_type Post type of current Quick Edit post.
|
2015-01-30 20:18:23 +01:00
|
|
|
*/
|
2015-01-30 20:29:22 +01:00
|
|
|
if ( ! apply_filters( 'quick_edit_show_taxonomy', $show_in_quick_edit, $taxonomy_name, $screen->post_type ) ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
continue;
|
2015-01-30 20:18:23 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
if ( $taxonomy->hierarchical ) {
|
2010-10-25 02:12:41 +02:00
|
|
|
$hierarchical_taxonomies[] = $taxonomy;
|
2017-12-01 00:11:00 +01:00
|
|
|
} else {
|
2010-10-25 02:12:41 +02:00
|
|
|
$flat_taxonomies[] = $taxonomy;
|
2017-12-01 00:11:00 +01:00
|
|
|
}
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
|
2020-07-12 13:36:04 +02:00
|
|
|
$m = ( isset( $mode ) && 'excerpt' === $mode ) ? 'excerpt' : 'list';
|
2017-12-01 00:11:00 +01:00
|
|
|
$can_publish = current_user_can( $post_type_object->cap->publish_posts );
|
|
|
|
$core_columns = array(
|
|
|
|
'cb' => true,
|
|
|
|
'date' => true,
|
|
|
|
'title' => true,
|
|
|
|
'categories' => true,
|
|
|
|
'tags' => true,
|
|
|
|
'comments' => true,
|
|
|
|
'author' => true,
|
|
|
|
);
|
2018-08-17 03:51:36 +02:00
|
|
|
?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<form method="get">
|
|
|
|
<table style="display: none"><tbody id="inlineedit">
|
2010-10-25 02:12:41 +02:00
|
|
|
<?php
|
2017-12-01 00:11:00 +01:00
|
|
|
$hclass = count( $hierarchical_taxonomies ) ? 'post' : 'page';
|
2017-09-23 13:02:46 +02:00
|
|
|
$inline_edit_classes = "inline-edit-row inline-edit-row-$hclass";
|
|
|
|
$bulk_edit_classes = "bulk-edit-row bulk-edit-row-$hclass bulk-edit-{$screen->post_type}";
|
|
|
|
$quick_edit_classes = "quick-edit-row quick-edit-row-$hclass inline-edit-{$screen->post_type}";
|
|
|
|
|
2010-10-25 02:12:41 +02:00
|
|
|
$bulk = 0;
|
2021-05-03 15:57:04 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
while ( $bulk < 2 ) :
|
|
|
|
$classes = $inline_edit_classes . ' ';
|
|
|
|
$classes .= $bulk ? $bulk_edit_classes : $quick_edit_classes;
|
2018-08-17 03:51:36 +02:00
|
|
|
?>
|
2020-01-29 01:45:18 +01:00
|
|
|
<tr id="<?php echo $bulk ? 'bulk-edit' : 'inline-edit'; ?>" class="<?php echo $classes; ?>" style="display: none">
|
|
|
|
<td colspan="<?php echo $this->get_column_count(); ?>" class="colspanchange">
|
2022-04-07 18:44:05 +02:00
|
|
|
<div class="inline-edit-wrapper" role="region" aria-labelledby="inline-edit-legend">
|
2020-01-29 01:45:18 +01:00
|
|
|
<fieldset class="inline-edit-col-left">
|
2022-04-07 18:44:05 +02:00
|
|
|
<legend class="inline-edit-legend" id="inline-edit-legend"><?php echo $bulk ? __( 'Bulk Edit' ) : __( 'Quick Edit' ); ?></legend>
|
2020-01-29 01:45:18 +01:00
|
|
|
<div class="inline-edit-col">
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( post_type_supports( $screen->post_type, 'title' ) ) : ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( $bulk ) : ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<div id="bulk-title-div">
|
|
|
|
<div id="bulk-titles"></div>
|
|
|
|
</div>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php else : // $bulk ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<label>
|
|
|
|
<span class="title"><?php _e( 'Title' ); ?></span>
|
|
|
|
<span class="input-text-wrap"><input type="text" name="post_title" class="ptitle" value="" /></span>
|
|
|
|
</label>
|
2018-10-02 17:53:23 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( is_post_type_viewable( $screen->post_type ) ) : ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<label>
|
|
|
|
<span class="title"><?php _e( 'Slug' ); ?></span>
|
Quick/Bulk Edit: Disable auto-correct for slugs.
Disable auto-correct for the slug field on the quick/bulk edit interface. As slugs may consist of a number of words combined in to a single string, they are unlikely to pass spell checkers.
Props swb1192, SergeyBiryukov, afragen, Clorith, desrosj, JeffPaul, sabernhardt, Boniu91, costdev, hellofromTonya.
Fixes #50499.
Built from https://develop.svn.wordpress.org/trunk@52092
git-svn-id: http://core.svn.wordpress.org/trunk@51684 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-11-10 01:02:59 +01:00
|
|
|
<span class="input-text-wrap"><input type="text" name="post_name" value="" autocomplete="off" spellcheck="false" /></span>
|
2020-01-29 01:45:18 +01:00
|
|
|
</label>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endif; // is_post_type_viewable() ?>
|
2017-12-01 00:11:00 +01:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endif; // $bulk ?>
|
|
|
|
|
|
|
|
<?php endif; // post_type_supports( ... 'title' ) ?>
|
|
|
|
|
|
|
|
<?php if ( ! $bulk ) : ?>
|
|
|
|
<fieldset class="inline-edit-date">
|
|
|
|
<legend><span class="title"><?php _e( 'Date' ); ?></span></legend>
|
|
|
|
<?php touch_time( 1, 1, 0, 1 ); ?>
|
|
|
|
</fieldset>
|
|
|
|
<br class="clear" />
|
|
|
|
<?php endif; // $bulk ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2019-01-12 07:41:52 +01:00
|
|
|
<?php
|
2022-04-08 08:26:02 +02:00
|
|
|
if ( post_type_supports( $screen->post_type, 'author' ) ) {
|
2020-01-29 01:45:18 +01:00
|
|
|
$authors_dropdown = '';
|
|
|
|
|
2021-05-03 15:57:04 +02:00
|
|
|
if ( current_user_can( $post_type_object->cap->edit_others_posts ) ) {
|
2022-04-08 08:26:02 +02:00
|
|
|
$dropdown_name = 'post_author';
|
|
|
|
$dropdown_class = 'authors';
|
|
|
|
if ( wp_is_large_user_count() ) {
|
|
|
|
$authors_dropdown = sprintf( '<select name="%s" class="%s hidden"></select>', esc_attr( $dropdown_name ), esc_attr( $dropdown_class ) );
|
|
|
|
} else {
|
|
|
|
$users_opt = array(
|
|
|
|
'hide_if_only_one_author' => false,
|
|
|
|
'capability' => array( $post_type_object->cap->edit_posts ),
|
|
|
|
'name' => $dropdown_name,
|
|
|
|
'class' => $dropdown_class,
|
|
|
|
'multi' => 1,
|
|
|
|
'echo' => 0,
|
|
|
|
'show' => 'display_name_with_login',
|
|
|
|
);
|
|
|
|
|
|
|
|
if ( $bulk ) {
|
|
|
|
$users_opt['show_option_none'] = __( '— No Change —' );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Filters the arguments used to generate the Quick Edit authors drop-down.
|
|
|
|
*
|
|
|
|
* @since 5.6.0
|
|
|
|
*
|
|
|
|
* @see wp_dropdown_users()
|
|
|
|
*
|
|
|
|
* @param array $users_opt An array of arguments passed to wp_dropdown_users().
|
|
|
|
* @param bool $bulk A flag to denote if it's a bulk action.
|
|
|
|
*/
|
|
|
|
$users_opt = apply_filters( 'quick_edit_dropdown_authors_args', $users_opt, $bulk );
|
|
|
|
|
|
|
|
$authors = wp_dropdown_users( $users_opt );
|
|
|
|
|
|
|
|
if ( $authors ) {
|
|
|
|
$authors_dropdown = '<label class="inline-edit-author">';
|
|
|
|
$authors_dropdown .= '<span class="title">' . __( 'Author' ) . '</span>';
|
|
|
|
$authors_dropdown .= $authors;
|
|
|
|
$authors_dropdown .= '</label>';
|
|
|
|
}
|
2021-05-03 15:57:04 +02:00
|
|
|
}
|
|
|
|
} // current_user_can( 'edit_others_posts' )
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
if ( ! $bulk ) {
|
|
|
|
echo $authors_dropdown;
|
|
|
|
}
|
2021-05-03 15:57:04 +02:00
|
|
|
} // post_type_supports( ... 'author' )
|
2019-01-12 07:41:52 +01:00
|
|
|
?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( ! $bulk && $can_publish ) : ?>
|
|
|
|
|
|
|
|
<div class="inline-edit-group wp-clearfix">
|
|
|
|
<label class="alignleft">
|
|
|
|
<span class="title"><?php _e( 'Password' ); ?></span>
|
|
|
|
<span class="input-text-wrap"><input type="text" name="post_password" class="inline-edit-password-input" value="" /></span>
|
|
|
|
</label>
|
|
|
|
|
Accessibility: Improve readability by removing unnecessary italic font style.
Per Web Content Accessibility Guidelines 2.0, big chunks of italic text should be avoided.
Same applies to UI controls, since they're meant to be comfortably readable by the largest possible audience, e.g.: label elements.
Removes italic font style from:
- the Quick Edit / Bulk Edit forms
- the Recovery Mode plugin error details
- the Image Editor inline help
Props birgire, audrasjb, SergeyBiryukov, melchoyce, estelaris, sabernhardt, xkon, nrqsnchz, afercia.
See #47327.
Built from https://develop.svn.wordpress.org/trunk@47304
git-svn-id: http://core.svn.wordpress.org/trunk@47104 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2020-02-18 16:32:09 +01:00
|
|
|
<span class="alignleft inline-edit-or">
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php
|
|
|
|
/* translators: Between password field and private checkbox on post quick edit interface. */
|
|
|
|
_e( '–OR–' );
|
|
|
|
?>
|
Accessibility: Improve readability by removing unnecessary italic font style.
Per Web Content Accessibility Guidelines 2.0, big chunks of italic text should be avoided.
Same applies to UI controls, since they're meant to be comfortably readable by the largest possible audience, e.g.: label elements.
Removes italic font style from:
- the Quick Edit / Bulk Edit forms
- the Recovery Mode plugin error details
- the Image Editor inline help
Props birgire, audrasjb, SergeyBiryukov, melchoyce, estelaris, sabernhardt, xkon, nrqsnchz, afercia.
See #47327.
Built from https://develop.svn.wordpress.org/trunk@47304
git-svn-id: http://core.svn.wordpress.org/trunk@47104 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2020-02-18 16:32:09 +01:00
|
|
|
</span>
|
2020-01-29 01:45:18 +01:00
|
|
|
<label class="alignleft inline-edit-private">
|
|
|
|
<input type="checkbox" name="keep_private" value="private" />
|
|
|
|
<span class="checkbox-title"><?php _e( 'Private' ); ?></span>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</fieldset>
|
|
|
|
|
|
|
|
<?php if ( count( $hierarchical_taxonomies ) && ! $bulk ) : ?>
|
|
|
|
|
|
|
|
<fieldset class="inline-edit-col-center inline-edit-categories">
|
|
|
|
<div class="inline-edit-col">
|
|
|
|
|
|
|
|
<?php foreach ( $hierarchical_taxonomies as $taxonomy ) : ?>
|
|
|
|
|
|
|
|
<span class="title inline-edit-categories-label"><?php echo esc_html( $taxonomy->labels->name ); ?></span>
|
2020-02-09 17:55:09 +01:00
|
|
|
<input type="hidden" name="<?php echo ( 'category' === $taxonomy->name ) ? 'post_category[]' : 'tax_input[' . esc_attr( $taxonomy->name ) . '][]'; ?>" value="0" />
|
2020-01-29 01:45:18 +01:00
|
|
|
<ul class="cat-checklist <?php echo esc_attr( $taxonomy->name ); ?>-checklist">
|
2021-07-31 11:50:57 +02:00
|
|
|
<?php wp_terms_checklist( 0, array( 'taxonomy' => $taxonomy->name ) ); ?>
|
2020-01-29 01:45:18 +01:00
|
|
|
</ul>
|
|
|
|
|
|
|
|
<?php endforeach; // $hierarchical_taxonomies as $taxonomy ?>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</fieldset>
|
|
|
|
|
|
|
|
<?php endif; // count( $hierarchical_taxonomies ) && ! $bulk ?>
|
|
|
|
|
|
|
|
<fieldset class="inline-edit-col-right">
|
|
|
|
<div class="inline-edit-col">
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2017-12-01 00:11:00 +01:00
|
|
|
<?php
|
2022-04-08 08:26:02 +02:00
|
|
|
if ( post_type_supports( $screen->post_type, 'author' ) && $bulk ) {
|
2020-01-29 01:45:18 +01:00
|
|
|
echo $authors_dropdown;
|
|
|
|
}
|
2017-12-01 00:11:00 +01:00
|
|
|
?>
|
2020-01-29 01:45:18 +01:00
|
|
|
|
|
|
|
<?php if ( post_type_supports( $screen->post_type, 'page-attributes' ) ) : ?>
|
|
|
|
|
|
|
|
<?php if ( $post_type_object->hierarchical ) : ?>
|
|
|
|
|
|
|
|
<label>
|
|
|
|
<span class="title"><?php _e( 'Parent' ); ?></span>
|
|
|
|
<?php
|
|
|
|
$dropdown_args = array(
|
|
|
|
'post_type' => $post_type_object->name,
|
|
|
|
'selected' => $post->post_parent,
|
|
|
|
'name' => 'post_parent',
|
|
|
|
'show_option_none' => __( 'Main Page (no parent)' ),
|
|
|
|
'option_none_value' => 0,
|
|
|
|
'sort_column' => 'menu_order, post_title',
|
|
|
|
);
|
|
|
|
|
|
|
|
if ( $bulk ) {
|
|
|
|
$dropdown_args['show_option_no_change'] = __( '— No Change —' );
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Filters the arguments used to generate the Quick Edit page-parent drop-down.
|
|
|
|
*
|
|
|
|
* @since 2.7.0
|
2020-10-20 18:40:05 +02:00
|
|
|
* @since 5.6.0 The `$bulk` parameter was added.
|
2020-01-29 01:45:18 +01:00
|
|
|
*
|
|
|
|
* @see wp_dropdown_pages()
|
|
|
|
*
|
2020-10-20 18:40:05 +02:00
|
|
|
* @param array $dropdown_args An array of arguments passed to wp_dropdown_pages().
|
|
|
|
* @param bool $bulk A flag to denote if it's a bulk action.
|
2020-01-29 01:45:18 +01:00
|
|
|
*/
|
2020-10-20 18:40:05 +02:00
|
|
|
$dropdown_args = apply_filters( 'quick_edit_dropdown_pages_args', $dropdown_args, $bulk );
|
2020-01-29 01:45:18 +01:00
|
|
|
|
|
|
|
wp_dropdown_pages( $dropdown_args );
|
|
|
|
?>
|
|
|
|
</label>
|
|
|
|
|
|
|
|
<?php endif; // hierarchical ?>
|
|
|
|
|
|
|
|
<?php if ( ! $bulk ) : ?>
|
|
|
|
|
|
|
|
<label>
|
|
|
|
<span class="title"><?php _e( 'Order' ); ?></span>
|
|
|
|
<span class="input-text-wrap"><input type="text" name="menu_order" class="inline-edit-menu-order-input" value="<?php echo $post->menu_order; ?>" /></span>
|
|
|
|
</label>
|
|
|
|
|
|
|
|
<?php endif; // ! $bulk ?>
|
|
|
|
|
|
|
|
<?php endif; // post_type_supports( ... 'page-attributes' ) ?>
|
|
|
|
|
|
|
|
<?php if ( 0 < count( get_page_templates( null, $screen->post_type ) ) ) : ?>
|
|
|
|
|
|
|
|
<label>
|
|
|
|
<span class="title"><?php _e( 'Template' ); ?></span>
|
|
|
|
<select name="page_template">
|
|
|
|
<?php if ( $bulk ) : ?>
|
|
|
|
<option value="-1"><?php _e( '— No Change —' ); ?></option>
|
|
|
|
<?php endif; // $bulk ?>
|
|
|
|
<?php
|
|
|
|
/** This filter is documented in wp-admin/includes/meta-boxes.php */
|
2020-07-23 20:55:01 +02:00
|
|
|
$default_title = apply_filters( 'default_page_template_title', __( 'Default template' ), 'quick-edit' );
|
2020-01-29 01:45:18 +01:00
|
|
|
?>
|
|
|
|
<option value="default"><?php echo esc_html( $default_title ); ?></option>
|
|
|
|
<?php page_template_dropdown( '', $screen->post_type ); ?>
|
|
|
|
</select>
|
|
|
|
</label>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2019-01-12 07:41:52 +01:00
|
|
|
<?php endif; ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( count( $flat_taxonomies ) && ! $bulk ) : ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php foreach ( $flat_taxonomies as $taxonomy ) : ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( current_user_can( $taxonomy->cap->assign_terms ) ) : ?>
|
|
|
|
<?php $taxonomy_name = esc_attr( $taxonomy->name ); ?>
|
2022-04-07 18:44:05 +02:00
|
|
|
<div class="inline-edit-tags-wrap">
|
2020-01-29 01:45:18 +01:00
|
|
|
<label class="inline-edit-tags">
|
|
|
|
<span class="title"><?php echo esc_html( $taxonomy->labels->name ); ?></span>
|
2022-04-07 18:44:05 +02:00
|
|
|
<textarea data-wp-taxonomy="<?php echo $taxonomy_name; ?>" cols="22" rows="1" name="tax_input[<?php echo esc_attr( $taxonomy->name ); ?>]" class="tax_input_<?php echo esc_attr( $taxonomy->name ); ?>" aria-describedby="inline-edit-<?php echo esc_attr( $taxonomy->name ); ?>-desc"></textarea>
|
2020-01-29 01:45:18 +01:00
|
|
|
</label>
|
2022-04-07 18:44:05 +02:00
|
|
|
<p class="howto" id="inline-edit-<?php echo esc_attr( $taxonomy->name ); ?>-desc"><?php echo esc_html( $taxonomy->labels->separate_items_with_commas ); ?></p>
|
|
|
|
</div>
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endif; // current_user_can( 'assign_terms' ) ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endforeach; // $flat_taxonomies as $taxonomy ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endif; // count( $flat_taxonomies ) && ! $bulk ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( post_type_supports( $screen->post_type, 'comments' ) || post_type_supports( $screen->post_type, 'trackbacks' ) ) : ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( $bulk ) : ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<div class="inline-edit-group wp-clearfix">
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( post_type_supports( $screen->post_type, 'comments' ) ) : ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<label class="alignleft">
|
|
|
|
<span class="title"><?php _e( 'Comments' ); ?></span>
|
|
|
|
<select name="comment_status">
|
|
|
|
<option value=""><?php _e( '— No Change —' ); ?></option>
|
|
|
|
<option value="open"><?php _e( 'Allow' ); ?></option>
|
|
|
|
<option value="closed"><?php _e( 'Do not allow' ); ?></option>
|
|
|
|
</select>
|
|
|
|
</label>
|
2014-02-25 07:12:13 +01:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endif; ?>
|
2014-02-25 07:12:13 +01:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( post_type_supports( $screen->post_type, 'trackbacks' ) ) : ?>
|
2018-08-17 03:51:36 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<label class="alignright">
|
|
|
|
<span class="title"><?php _e( 'Pings' ); ?></span>
|
|
|
|
<select name="ping_status">
|
|
|
|
<option value=""><?php _e( '— No Change —' ); ?></option>
|
|
|
|
<option value="open"><?php _e( 'Allow' ); ?></option>
|
|
|
|
<option value="closed"><?php _e( 'Do not allow' ); ?></option>
|
|
|
|
</select>
|
|
|
|
</label>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endif; ?>
|
2011-10-24 21:13:23 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
</div>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php else : // $bulk ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<div class="inline-edit-group wp-clearfix">
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( post_type_supports( $screen->post_type, 'comments' ) ) : ?>
|
Posts, Post Types: Add support for post type templates.
WordPress has supported custom page templates for over 12 years, allowing developers to create various layouts for specific pages.
While this feature is very helpful, it has always been limited to the 'page' post type and not was not available to other post types.
By opening up the page template functionality to all post types, we continue to improve the template hierarchy's flexibility.
In addition to the `Template Name` file header, the post types supported by a template can be specified using `Template Post Type: post, foo, bar`.
When at least one template exists for a post type, the 'Post Attributes' meta box will be displayed in the back end, without the need to add post type support for `'page-attributes'`. 'Post Attributes' can be customized per post type using the `'attributes'` label when registering a post type.
Props johnbillion, Mte90, dipesh.kakadiya, swissspidy.
Fixes #18375.
Built from https://develop.svn.wordpress.org/trunk@38951
git-svn-id: http://core.svn.wordpress.org/trunk@38894 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-26 10:07:30 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<label class="alignleft">
|
|
|
|
<input type="checkbox" name="comment_status" value="open" />
|
|
|
|
<span class="checkbox-title"><?php _e( 'Allow Comments' ); ?></span>
|
|
|
|
</label>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endif; ?>
|
2016-10-21 12:33:54 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( post_type_supports( $screen->post_type, 'trackbacks' ) ) : ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<label class="alignleft">
|
|
|
|
<input type="checkbox" name="ping_status" value="open" />
|
|
|
|
<span class="checkbox-title"><?php _e( 'Allow Pings' ); ?></span>
|
|
|
|
</label>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endif; ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
</div>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endif; // $bulk ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endif; // post_type_supports( ... comments or pings ) ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<div class="inline-edit-group wp-clearfix">
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<label class="inline-edit-status alignleft">
|
|
|
|
<span class="title"><?php _e( 'Status' ); ?></span>
|
|
|
|
<select name="_status">
|
|
|
|
<?php if ( $bulk ) : ?>
|
|
|
|
<option value="-1"><?php _e( '— No Change —' ); ?></option>
|
|
|
|
<?php endif; // $bulk ?>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( $can_publish ) : // Contributors only get "Unpublished" and "Pending Review". ?>
|
|
|
|
<option value="publish"><?php _e( 'Published' ); ?></option>
|
|
|
|
<option value="future"><?php _e( 'Scheduled' ); ?></option>
|
|
|
|
<?php if ( $bulk ) : ?>
|
|
|
|
<option value="private"><?php _e( 'Private' ); ?></option>
|
|
|
|
<?php endif; // $bulk ?>
|
|
|
|
<?php endif; ?>
|
2013-09-19 19:47:08 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<option value="pending"><?php _e( 'Pending Review' ); ?></option>
|
|
|
|
<option value="draft"><?php _e( 'Draft' ); ?></option>
|
|
|
|
</select>
|
|
|
|
</label>
|
2013-09-19 19:47:08 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( 'post' === $screen->post_type && $can_publish && current_user_can( $post_type_object->cap->edit_others_posts ) ) : ?>
|
2013-09-19 19:47:08 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php if ( $bulk ) : ?>
|
2013-09-19 19:47:08 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<label class="alignright">
|
|
|
|
<span class="title"><?php _e( 'Sticky' ); ?></span>
|
|
|
|
<select name="sticky">
|
|
|
|
<option value="-1"><?php _e( '— No Change —' ); ?></option>
|
|
|
|
<option value="sticky"><?php _e( 'Sticky' ); ?></option>
|
|
|
|
<option value="unsticky"><?php _e( 'Not Sticky' ); ?></option>
|
|
|
|
</select>
|
|
|
|
</label>
|
2013-09-19 19:47:08 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php else : // $bulk ?>
|
|
|
|
|
|
|
|
<label class="alignleft">
|
|
|
|
<input type="checkbox" name="sticky" value="sticky" />
|
|
|
|
<span class="checkbox-title"><?php _e( 'Make this post sticky' ); ?></span>
|
|
|
|
</label>
|
|
|
|
|
|
|
|
<?php endif; // $bulk ?>
|
|
|
|
|
|
|
|
<?php endif; // 'post' && $can_publish && current_user_can( 'edit_others_posts' ) ?>
|
2013-09-19 19:47:08 +02:00
|
|
|
|
2020-01-29 01:45:18 +01:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<?php if ( $bulk && current_theme_supports( 'post-formats' ) && post_type_supports( $screen->post_type, 'post-formats' ) ) : ?>
|
|
|
|
<?php $post_formats = get_theme_support( 'post-formats' ); ?>
|
|
|
|
|
|
|
|
<label class="alignleft">
|
|
|
|
<span class="title"><?php _ex( 'Format', 'post format' ); ?></span>
|
|
|
|
<select name="post_format">
|
|
|
|
<option value="-1"><?php _e( '— No Change —' ); ?></option>
|
|
|
|
<option value="0"><?php echo get_post_format_string( 'standard' ); ?></option>
|
|
|
|
<?php if ( is_array( $post_formats[0] ) ) : ?>
|
|
|
|
<?php foreach ( $post_formats[0] as $format ) : ?>
|
|
|
|
<option value="<?php echo esc_attr( $format ); ?>"><?php echo esc_html( get_post_format_string( $format ) ); ?></option>
|
|
|
|
<?php endforeach; ?>
|
|
|
|
<?php endif; ?>
|
|
|
|
</select>
|
|
|
|
</label>
|
|
|
|
|
|
|
|
<?php endif; ?>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</fieldset>
|
2010-10-25 02:12:41 +02:00
|
|
|
|
2018-08-17 03:51:36 +02:00
|
|
|
<?php
|
|
|
|
list( $columns ) = $this->get_column_info();
|
2014-02-25 07:12:13 +01:00
|
|
|
|
2018-08-17 03:51:36 +02:00
|
|
|
foreach ( $columns as $column_name => $column_display_name ) {
|
|
|
|
if ( isset( $core_columns[ $column_name ] ) ) {
|
|
|
|
continue;
|
|
|
|
}
|
2014-02-25 07:12:13 +01:00
|
|
|
|
2018-08-17 03:51:36 +02:00
|
|
|
if ( $bulk ) {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Fires once for each column in Bulk Edit mode.
|
|
|
|
*
|
|
|
|
* @since 2.7.0
|
|
|
|
*
|
2019-07-31 17:10:58 +02:00
|
|
|
* @param string $column_name Name of the column to edit.
|
|
|
|
* @param string $post_type The post type slug.
|
2018-08-17 03:51:36 +02:00
|
|
|
*/
|
|
|
|
do_action( 'bulk_edit_custom_box', $column_name, $screen->post_type );
|
|
|
|
} else {
|
2014-02-25 07:12:13 +01:00
|
|
|
|
2018-08-17 03:51:36 +02:00
|
|
|
/**
|
|
|
|
* Fires once for each column in Quick Edit mode.
|
|
|
|
*
|
|
|
|
* @since 2.7.0
|
|
|
|
*
|
|
|
|
* @param string $column_name Name of the column to edit.
|
|
|
|
* @param string $post_type The post type slug, or current screen name if this is a taxonomy list table.
|
2019-07-31 17:10:58 +02:00
|
|
|
* @param string $taxonomy The taxonomy name, if any.
|
2018-08-17 03:51:36 +02:00
|
|
|
*/
|
|
|
|
do_action( 'quick_edit_custom_box', $column_name, $screen->post_type, '' );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
?>
|
2020-01-29 01:45:18 +01:00
|
|
|
|
|
|
|
<div class="submit inline-edit-save">
|
|
|
|
<?php if ( ! $bulk ) : ?>
|
|
|
|
<?php wp_nonce_field( 'inlineeditnonce', '_inline_edit', false ); ?>
|
2022-03-29 21:08:19 +02:00
|
|
|
<button type="button" class="button button-primary save"><?php _e( 'Update' ); ?></button>
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php else : ?>
|
2022-03-29 21:08:19 +02:00
|
|
|
<?php submit_button( __( 'Update' ), 'primary', 'bulk_edit', false ); ?>
|
|
|
|
<?php endif; ?>
|
|
|
|
|
|
|
|
<button type="button" class="button cancel"><?php _e( 'Cancel' ); ?></button>
|
|
|
|
|
|
|
|
<?php if ( ! $bulk ) : ?>
|
|
|
|
<span class="spinner"></span>
|
2020-01-29 01:45:18 +01:00
|
|
|
<?php endif; ?>
|
|
|
|
|
|
|
|
<input type="hidden" name="post_view" value="<?php echo esc_attr( $m ); ?>" />
|
|
|
|
<input type="hidden" name="screen" value="<?php echo esc_attr( $screen->id ); ?>" />
|
|
|
|
<?php if ( ! $bulk && ! post_type_supports( $screen->post_type, 'author' ) ) : ?>
|
|
|
|
<input type="hidden" name="post_author" value="<?php echo esc_attr( $post->post_author ); ?>" />
|
|
|
|
<?php endif; ?>
|
|
|
|
|
|
|
|
<div class="notice notice-error notice-alt inline hidden">
|
|
|
|
<p class="error"></p>
|
|
|
|
</div>
|
2017-10-02 23:52:52 +02:00
|
|
|
</div>
|
2022-04-07 18:44:05 +02:00
|
|
|
</div> <!-- end of .inline-edit-wrapper -->
|
2020-01-29 01:45:18 +01:00
|
|
|
|
|
|
|
</td></tr>
|
|
|
|
|
2018-08-17 03:51:36 +02:00
|
|
|
<?php
|
|
|
|
$bulk++;
|
2020-01-29 01:45:18 +01:00
|
|
|
endwhile;
|
2018-08-17 03:51:36 +02:00
|
|
|
?>
|
2020-01-29 01:45:18 +01:00
|
|
|
</tbody></table>
|
|
|
|
</form>
|
2018-08-17 03:51:36 +02:00
|
|
|
<?php
|
2010-10-25 02:12:41 +02:00
|
|
|
}
|
|
|
|
}
|