관리-도구
편집 파일: class-docs-list-table.php
<?php /** * Admin documentor list. * * @package documentor */ /** * Modifier functions in docs list table */ class Documentor_Docs_List_Table { /** * Construct */ public function __construct() { add_filter( 'manage_docs_posts_columns', array( $this, 'docs_list_columns' ) ); add_action( 'manage_docs_posts_custom_column', array( $this, 'docs_list_columns_row' ), 10, 2 ); add_filter( 'manage_edit-docs_sortable_columns', array( $this, 'docs_sortable_columns' ) ); add_action( 'load-edit.php', array( $this, 'edit_docs_load' ) ); add_action( 'load-post.php', array( $this, 'add_meta_box' ) ); add_action( 'save_post_docs', array( $this, 'save_helpfulness_meta_box' ) ); // load css. add_action( 'admin_print_styles-post.php', array( $this, 'helpfulness_css' ) ); add_action( 'admin_print_styles-edit.php', array( $this, 'helpfulness_css' ) ); } /** * Add helpfulness metabox. */ public function add_meta_box() { add_meta_box( 'op-menu-meta-box-id', __( 'Helpfulness', 'documentor' ), array( $this, 'helpfulness_metabox' ), 'docs', 'side', 'core' ); } /** * Helpfulness metabox styles. */ public function helpfulness_css() { if ( get_current_screen()->post_type !== 'docs' ) { return; } ?> <style type="text/css"> .documentor-helpfulness-form { display: flex; flex-wrap: wrap; } .documentor-helpfulness-form > div { display: flex; flex: 1; align-items: center; } .documentor-helpfulness-form input[type="number"] { width: 45px; margin-left: 10px; text-align: center; } .documentor-helpfulness-form .documentor-positive { color: green; } .documentor-helpfulness-form .documentor-negative { color: red; justify-content: flex-end; } </style> <?php } /** * Helpfulness metabox content. */ public function helpfulness_metabox() { global $post; ?> <div class="documentor-helpfulness-form"> <div class="documentor-positive"> <span class="dashicons dashicons-thumbs-up"></span> <input type="number" name="positive" placeholder="0" value="<?php echo esc_attr( get_post_meta( $post->ID, 'positive', true ) ); ?>" /> </div> <div class="documentor-negative"> <span class="dashicons dashicons-thumbs-down"></span> <input type="number" name="negative" placeholder="0" value="<?php echo esc_attr( get_post_meta( $post->ID, 'negative', true ) ); ?>" /> </div> </div> <?php } /** * Save helpfulness meta data. * * @param int $post_id - post id. */ public function save_helpfulness_meta_box( $post_id ) { if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; } // Check the user's permissions. if ( ! current_user_can( 'edit_post', $post_id ) ) { return; } $fields = array( 'positive', 'negative', ); foreach ( $fields as $field ) { // phpcs:ignore if ( array_key_exists( $field, $_POST ) ) { // phpcs:ignore update_post_meta( $post_id, $field, sanitize_text_field( $_POST[ $field ] ) ); } } } /** * Vote column in the class UI * * @param array $columns current docs list columns. * * @return array */ public function docs_list_columns( $columns ) { $vote = array( 'votes' => __( 'Votes', 'documentor' ) ); // insert before last element, date. // remove first 3 items and store to $first_items, date remains to $columns. $first_items = array_splice( $columns, 0, 3 ); $new_columns = array_merge( $first_items, $vote, $columns ); return $new_columns; } /** * Make votes column sortable. * * @param array $columns current docs list columns. * * @return array */ public function docs_sortable_columns( $columns ) { $columns['votes'] = array( 'votes', true ); return $columns; } /** * Undocumented function * * @param string $column_name - column name. * @param int $post_id - post id. */ public function docs_list_columns_row( $column_name, $post_id ) { if ( 'votes' === $column_name ) { $positive = get_post_meta( $post_id, 'positive', true ); $negative = get_post_meta( $post_id, 'negative', true ); printf( '<span class="documentor-positive">%d</span>/<span class="documentor-negative">%d</span>', esc_html( $positive ), esc_html( $negative ) ); } } /** * Add request filter. */ public function edit_docs_load() { add_filter( 'request', array( $this, 'sort_docs' ) ); } /** * Sort the docs. * * @param array $vars - sort variables. * @return array */ public function sort_docs( $vars ) { // Check if we're viewing the 'docs' post type. if ( isset( $vars['post_type'] ) && 'docs' === $vars['post_type'] ) { // Check if 'orderby' is set to 'votes'. if ( isset( $vars['orderby'] ) && 'votes' === $vars['orderby'] ) { $vars = array_merge( $vars, array( // phpcs:ignore 'meta_key' => 'positive', 'orderby' => 'meta_value_num', ) ); } } return $vars; } }