Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I am working with a heavily customized install of WP. I've set up a specific post type, taxonomy, and roles that gets to use just that post type.

Ideally, I'd like to restrict members of that role using that post type to only create one post. This seems like it might be more trouble than it's worth. So barring that, I'd like to display only the oldest of their posts in an archive view.

I've got the following, which creates a workable archive loop, but I haven't figured out the "if number of posts > 1 then show only oldest post" bit.

    $args = array
    ('post_type' => 'ticketlisting',
        'posts_per_page' => 50,
        'tax_query' => array
        (array
            (
            'taxonomy' => 'tier',
            'field' => 'slug',
            'terms' => 'goldstar'
            )
        )
    );

$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
    the_title();
    echo '<div class="entry-content">';
    $post_id = get_the_ID();
    /* show post content here */
    echo '</div>';
endwhile;
share|improve this question

1 Answer 1

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:      Thomas Scholz <info@toscho.de>
 * Author URI:  http://toscho.de
 * License:     MIT
 * License URI: http://www.opensource.org/licenses/mit-license.php
 *
 * Copyright (c) 2012 Thomas Scholz
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

// 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.

share|improve this answer
    
Thanks—this is a little out of my depth, but I get the general idea. I do want to be able to administer these posts (expiring them, etc). Not sure if this approach would permit that. I also want to allow other kinds of posts by these users--would this method show the post-writing interface as part of the profile or a top-level sidebar item? –  Adam Rice Feb 28 '12 at 0:01
    
@AdamRice I made an update to my answer to illustrate my suggestion better. –  toscho Feb 28 '12 at 0:53

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.