Show only oldest post by author

To restrict users to just one post, don’t let them create new posts. Just add one wp_editor() instance to their profile.

  • Hook into 'show_user_profile' and 'edit_user_profile' to show the editor.
  • Hook into 'personal_options_update' and 'edit_user_profile_update' to save the content to a user meta or a hidden custom post type.

Now they don’t have to search and they cannot create new posts.

Update

To illustrate what I mean, I refreshed an old plugin:

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: T5 User text rich editor
 * Text Domain: t5_utre
 * Domain Path: /lang
 * Description: Adds a rich editor to the user profile.
 * Version:     2012.02.28
 * Required:    3.3
 * Author:      Fuxia Scholz
 * Author URI:  https://fuxia.de
 */

// Not a WordPress context? Stop.
! defined( 'ABSPATH' ) and exit;

// Back end
add_action( 'admin_init', array ( 'T5_User_Text_Rich_Edit', 'init' ) );
// Front end
// Call it your theme’s author.php:
// do_action( 'print_t5_user_rich_text', $GLOBALS['authordata']->ID );
add_action(
    'print_t5_user_rich_text',
    array ( 'T5_User_Text_Rich_Edit', 'get_user_rich_text' ),
    4
);

class T5_User_Text_Rich_Edit
{
    protected
        /**
         * Internal name for the user meta field.
         * @type string
         */
        $handle="meta_post"

        /**
         * Current user ID
         *
         *  @type int
         */
    ,   $user_id = NULL
    ;

    /**
     * Copy of $handle. Used by the static method.
     *
     * @type string
     */
    protected static $public_handle="meta_post";

    /**
     * Creates a new instance. Called on 'admin_init'.
     *
     * @see    __construct()
     * @return void
     */
    public static function init()
    {
        new self;
    }

    /**
     * Contructor. Registers filters and actions.
     *
     * @param array $params Just 'handle', may be extended.
     * @return void
     */
    public function __construct( $params = array () )
    {
        isset ( $params['handle'] )
            and $this->handle        = $params['handle']
            and self::$public_handle = $params['handle'];

        add_action( 'show_user_profile',        array ( $this, 'show' ) );
        add_action( 'edit_user_profile',        array ( $this, 'show' ) );
        add_action( 'personal_options_update',  array ( $this, 'save' ) );
        add_action( 'edit_user_profile_update', array ( $this, 'save' ) );

    }

    /**
     * Public access to the field in your theme or plugin.
     *
     * @param  int    $user_id
     * @param  string $before
     * @param  string $after
     * @return string
     */
    public static function get_user_rich_text(
        $user_id,
        $before="",
        $after="",
        $print  = TRUE
    )
    {
        $content = get_the_author_meta( self::$public_handle, $user_id );
        ! empty ( $content )
            and $content = $before . wpautop( $content ) . $after;

        $print and print $content;
        return $content;
    }

    /**
     * Prints the form.
     *
     * @param  object $user
     * @return void
     */
    public function show( $user )
    {
        if ( ! current_user_can( 'edit_user', $user->ID ) )
        {
            return;
        }

        $label_text = __( 'Your personal post', 't5_utre' );
        $label      = "<label for="$this->handle">$label_text</label>";
        ?>
<table class="form-table">
    <tr>
        <th>
        <?php
        print $label;
        ?>
        </th>
        <td>
            <div style="width:504px">
            <?php
            $content = get_the_author_meta( $this->handle, $user->ID );
            $this->print_editor( $content );
            ?>
            </div>
        </td>
    </tr>
</table>
    <?php
    }

    /**
     * Print a new instance of wp_editor()
     *
     * @param string $content existing content
     * @return void
     */
    protected function print_editor( $content )
    {
        $editor_settings =  array (
            'textarea_rows' => 15
        ,   'media_buttons' => TRUE
        ,   'teeny'         => FALSE
        ,   'tinymce'       => TRUE
        );
        wp_editor( $content, $this->handle, $editor_settings );
    }

    /**
     * Saves the data.
     *
     * @param  int   $user_id
     * @return void
     */
    public function save( $user_id )
    {
        if ( ! current_user_can( 'edit_user', $user_id ) )
        {
            return;
        }

        $this->user_id = $user_id;
        $text_input    = empty ( $_POST[ $this->handle ] ) ? '' : $_POST[ $this->handle ];
        update_user_meta( $user_id, $this->handle, $text_input );
    }
}

You have to add the language files by yourself (or I put it on GitHub if somebody is interested enough).

You get a nice editor now at the bottom of the user profile:

enter image description here

In your theme’s author.php you may use the predefined action to access the data:

<?php do_action( 'print_t5_user_rich_text', $GLOBALS['authordata']->ID ); ?>

enter image description here

This plugin doesn’t touch any other capability the user may have. It is bound to the ability to edit her own profile, nothing else.

Leave a Comment