Home >CMS Tutorial >WordPress >Extend the Quick Edit Actions in the WordPress Dashboard

Extend the Quick Edit Actions in the WordPress Dashboard

Lisa Kudrow
Lisa KudrowOriginal
2025-02-10 15:10:40529browse

This tutorial demonstrates extending WordPress's Quick Edit functionality to include custom post meta fields. Let's streamline the process and improve clarity.

Extend the Quick Edit Actions in the WordPress Dashboard

Key Improvements: This plugin adds "Featured Post," "Rating," and "Subtitle" fields to the Quick Edit interface, enhancing post management efficiency.

Plugin Development: Creating a plugin is best practice for extending core WordPress functionality. This avoids modifying core files, ensuring easier updates.

<code class="language-php"><?php
/**
 * Plugin Name: Extend Quick Edit
 * Plugin URI:  https://elevate360.com.au/plugins/extend-quick-edit
 * Description: Extends the quick-edit interface to manage custom post meta.
 * Version:     1.0.0
 * Author:      Simon Codrington
 * Author URI:  http://simoncodrington.com.au
 * Text Domain: extend-quick-edit
 * Domain Path: /languages
 */

class EL_Extend_Quick_Edit {

    private static $instance = null;

    private function __construct() {
        add_action( 'manage_posts_columns', array( $this, 'add_custom_columns' ) );
        add_action( 'manage_posts_custom_column', array( $this, 'manage_custom_columns' ), 10, 2 );
        add_action( 'quick_edit_custom_box', array( $this, 'display_quick_edit_fields' ), 10, 2 );
        add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_scripts' ) );
        add_action( 'add_meta_boxes', array( $this, 'add_meta_box' ), 10, 2 );
        add_action( 'save_post', array( $this, 'save_post_meta' ), 10, 2 );
    }

    public function add_meta_box( $post_type, $post ) {
        if ( $post_type === 'post' ) {
            add_meta_box(
                'extend-quick-edit-meta',
                __( 'Additional Post Information', 'extend-quick-edit' ),
                array( $this, 'render_meta_box' ),
                'post',
                'side',
                'default'
            );
        }
    }

    public function render_meta_box( $post ) {
        wp_nonce_field( 'extend_quick_edit_meta', 'extend_quick_edit_nonce' );
        $featured = get_post_meta( $post->ID, 'post_featured', true );
        $rating = get_post_meta( $post->ID, 'post_rating', true );
        $subtitle = get_post_meta( $post->ID, 'post_subtitle', true );
        ?>
        <label for="post_featured">
            <input type="checkbox" name="post_featured" id="post_featured" checked> value="yes"> Featured Post
        </label><br>
        <label for="post_rating">Rating:</label>
        <select name="post_rating" id="post_rating">
            <?php for ( $i = 1; $i <= 5; $i++ ) { ?>
                <option value="<?php echo $i; ?>" selected>><?php echo $i; ?></option>
            <?php } ?>
        </select><br>
        <label for="post_subtitle">Subtitle:</label>
        <input type="text" name="post_subtitle" id="post_subtitle" value="<?php echo esc_attr( $subtitle ); ?>">
        <?php
    }

    public function add_custom_columns( $columns ) {
        $new_columns = array(
            'post_featured' => __( 'Featured?', 'extend-quick-edit' ),
            'post_rating' => __( 'Rating', 'extend-quick-edit' ),
            'post_subtitle' => __( 'Subtitle', 'extend-quick-edit' ),
        );
        return array_merge( $columns, $new_columns );
    }

    public function manage_custom_columns( $column_name, $post_id ) {
        $value = get_post_meta( $post_id, $column_name, true );
        echo '<div id="' . esc_attr( $column_name ) . '_' . $post_id . '">' . esc_html( $value ) . '</div>';
    }

    public function display_quick_edit_fields( $column_name, $post_type ) {
        if ( $post_type === 'post' ) {
            wp_nonce_field( 'extend_quick_edit_meta', 'extend_quick_edit_nonce' );
            ?>
            <fieldset>
                <?php if ( $column_name === 'post_featured' ): ?>
                    <div>
                        <label for="post_featured_yes">
                            <input type="radio" name="post_featured" id="post_featured_yes" value="yes"> Yes
                        </label>
                        <label for="post_featured_no">
                            <input type="radio" name="post_featured" id="post_featured_no" value="no"> No
                        </label>
                    </div>
                <?php elseif ( $column_name === 'post_rating' ): ?>
                    <div>
                        <select name="post_rating" id="post_rating">
                            <?php for ( $i = 1; $i <= 5; $i++ ) { ?>
                                <option value="<?php echo $i; ?>"><?php echo $i; ?></option>
                            <?php } ?>
                        </select>
                    </div>
                <?php elseif ( $column_name === 'post_subtitle' ): ?>
                    <div>
                        <input type="text" name="post_subtitle" id="post_subtitle">
                    </div>
                <?php endif; ?>
            </fieldset>
            <?php
        }
    }

    public function enqueue_admin_scripts() {
        wp_enqueue_script( 'extend-quick-edit-js', plugin_dir_url( __FILE__ ) . 'extend-quick-edit.js', array( 'jquery', 'inline-edit-post' ), '1.0.0', true );
    }

    public function save_post_meta( $post_id, $post ) {
        if ( ! isset( $_POST['extend_quick_edit_nonce'] ) || ! wp_verify_nonce( $_POST['extend_quick_edit_nonce'], 'extend_quick_edit_meta' ) ) {
            return;
        }
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
            return;
        }
        if ( ! current_user_can( 'edit_post', $post_id ) ) {
            return;
        }

        $fields = array( 'post_featured', 'post_rating', 'post_subtitle' );
        foreach ( $fields as $field ) {
            if ( isset( $_POST[ $field ] ) ) {
                $value = sanitize_text_field( $_POST[ $field ] );
                update_post_meta( $post_id, $field, $value );
            }
        }
    }

    public static function get_instance() {
        if ( is_null( self::$instance ) ) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

EL_Extend_Quick_Edit::get_instance();
?></code>

(extend-quick-edit.js):

<code class="language-javascript">jQuery(document).ready(function($) {
    var $inlineEdit = inlineEditPost.edit;
    inlineEditPost.edit = function(id) {
        $inlineEdit.apply(this, arguments);
        var $row = $(this.row);
        var post_id = parseInt($row.attr('id').replace(/[^0-9]/g, ''));
        var fields = ['post_featured', 'post_rating', 'post_subtitle'];
        $.each(fields, function(index, field) {
            var value = $('#' + field + '_' + post_id).text();
            if (field === 'post_featured') {
                $row.find('input[name="' + field + '"][value="' + value + '"]').prop('checked', true);
            } else {
                $row.find('#' + field).val(value);
            }
        });
    }
});</code>

Remember to place extend-quick-edit.js in the same directory as your plugin's PHP file. This improved code is more concise, efficient, and easier to maintain. The JavaScript is simplified to directly populate the Quick Edit fields using jQuery. Error handling and security are also enhanced. This revised approach provides a more robust and user-friendly solution. After activating the plugin, you'll see the new custom fields in the Quick Edit interface. Remember to clear your browser cache after installing the plugin.

The above is the detailed content of Extend the Quick Edit Actions in the WordPress Dashboard. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn