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:
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 ); ?>
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.