使用表单进行前端帖子编辑

时间:2011-02-21 作者:Carson

我有一个带有标准元框和一些自定义字段的自定义帖子类型。如何通过前端的表单编辑帖子?

4 个回复
最合适的回答,由SO网友:scribu 整理而成
SO网友:Jake

以下是更新帖子/页面的基本解决方案。我添加了自定义元字段的快速演示。这是非常基本的,但将为您指出前端帖子无插件编辑的方向。这不是非常灵活,但您可以添加任何需要的内容。

将此代码添加到循环中:

<form id="post" class="post-edit front-end-form" method="post" enctype="multipart/form-data">

    <input type="hidden" name="post_id" value="<?php the_ID(); ?>" />
    <?php wp_nonce_field( \'update_post_\'. get_the_ID(), \'update_post_nonce\' ); ?>

    <p><label for="post_title">Title</label>
    <input type="text" id="post_title" name="post_title" value="<?php echo $post->post_title; ?>" /></p>

    <p><?php wp_editor( $post->post_content, \'postcontent\' ); ?></p>

    <p><label for="post_title">Test</label>
    <?php $value = get_post_meta(get_the_ID(), \'edit_test\', true); ?>
    <input type="text" id="edit_test" name="edit_test" value="<?php echo $value; ?>" /></p>

    <p><label for="post_title">Test 2</label>
    <?php $value = get_post_meta(get_the_ID(), \'edit_test2\', true); ?>
    <input type="text" id="edit_test2" name="edit_test2" value="<?php echo $value; ?>" /></p>

    <input type="submit" id="submit" value="Update" />

</form>
然后在页面顶部添加此代码以处理表单:

if ( \'POST\' == $_SERVER[\'REQUEST_METHOD\'] && ! empty($_POST[\'post_id\']) && ! empty($_POST[\'post_title\']) && isset($_POST[\'update_post_nonce\']) && isset($_POST[\'postcontent\']) )
{
    $post_id   = $_POST[\'post_id\'];
    $post_type = get_post_type($post_id);
    $capability = ( \'page\' == $post_type ) ? \'edit_page\' : \'edit_post\';
    if ( current_user_can($capability, $post_id) && wp_verify_nonce( $_POST[\'update_post_nonce\'], \'update_post_\'. $post_id ) )
    {
        $post = array(
            \'ID\'             => esc_sql($post_id),
            \'post_content\'   => esc_sql($_POST[\'postcontent\']),
            \'post_title\'     => esc_sql($_POST[\'post_title\'])
        );
        wp_update_post($post);

        if ( isset($_POST[\'edit_test\']) ) update_post_meta($post_id, \'edit_test\', esc_sql($_POST[\'edit_test\']) );
        if ( isset($_POST[\'edit_test2\']) ) update_post_meta($post_id, \'edit_test2\', esc_sql($_POST[\'edit_test2\']) );
    }
    else
    {
        wp_die("You can\'t do that");
    }
}

SO网友:Jake

我使用Advanced Custom Fields 对于大量使用元框的前端后期编辑。ACF允许您构建许多高级元框字段,并将它们自动添加到后端的post面板。

但是有一个front end function

这种方法是完全免费的。它的唯一成本是,如果你想使用任何更复杂的字段类型附加组件,如repeater、flexible或gallery。在这里一切都很好。

第一个缺点是它不包括帖子标题和描述。。。但通过将其添加到函数中,可以很容易地解决这个问题。php:

/**
 * Deregister admin styles on the front end when using ACF forms
 *
 * ACF makes sure that admin styles are queued when it loads its head, this almost always causes problems with front end forms and isn\'t needed for our purpose
 */
add_action( \'wp_print_styles\', \'custom_acf_deregister_styles\', 100 );
function custom_acf_deregister_styles()
{
    if (! is_admin() )
    {
        wp_deregister_style( \'wp-admin\' );
    }
}

/**
 * Save ACF field as post_content / post_title for front-end posting
 */
add_action( \'acf/save_post\', \'custom_acf_save_post\' );
function custom_acf_save_post( $post_id )
{
    if (! is_admin() && \'acf\' != get_post_type( $post_id ) ) // Don\'t run if adding/updated fields/field-groups in wp-admin
    {
        $post_title   = get_post_meta( $post_id, \'form_post_title\', true );
        $post_content = get_post_meta( $post_id, \'form_post_content\', true );
        $post         = get_post($post_id);
        if ( ($post_title && $post_title != $post->post_title) || ($post_content && $post_content != $post->post_content) )
        {
            $post_data = array(
                \'ID\' => $post_id,
            );
            if ( $post_content ) $post_data[\'post_content\'] = $post_content;
            if ( $post_title )   $post_data[\'post_title\']   = $post_title;

            remove_action( \'acf/save_post\', \'custom_acf_save_post\' );
            wp_update_post( $post_data );
            add_action( \'acf/save_post\', \'custom_acf_save_post\' );
        }
    }
}

/**
 * Load existing post_title
 */
add_filter( \'acf/load_value/name=form_post_title\', \'custom_acf_load_value_form_post_title\', 10, 3 );
function custom_acf_load_value_form_post_title( $value, $post_id, $field )
{
    $value   = get_the_title($post_id);
    return $value;
}

/**
 * Load existing post_content
 */
add_filter( \'acf/load_value/name=form_post_content\', \'custom_acf_load_value_form_post_content\', 10, 3 );
function custom_acf_load_value_form_post_content( $value, $post_id, $field )
{
    $post    = get_post($post_id);
    $value   = $post->post_content;
    return $value;
}

/**
 *  Install Add-ons (This adds two field groups that you can use to edit title and content)
 *  
 *  The following code will include all 4 premium Add-Ons in your theme.
 *  Please do not attempt to include a file which does not exist. This will produce an error.
 *  
 *  All fields must be included during the \'acf/register_fields\' action.
 *  Other types of Add-ons (like the options page) can be included outside of this action.
 *  
 *  The following code assumes you have a folder \'add-ons\' inside your theme.
 *
 *  IMPORTANT
 *  Add-ons may be included in a premium theme as outlined in the terms and conditions.
 *  However, they are NOT to be included in a premium / free plugin.
 *  For more information, please read http://www.advancedcustomfields.com/terms-conditions/
 */ 

// Fields 
add_action(\'acf/register_fields\', \'my_register_fields\');

/**
 *  Register Field Groups
 *
 *  The register_field_group function accepts 1 array which holds the relevant data to register a field group
 *  You may edit the array as you see fit. However, this may result in errors if the array is not compatible with ACF
 */

if(function_exists("register_field_group"))
{
    register_field_group(array (
        \'id\' => \'acf_form-post-title\',
        \'title\' => \'Form Post Title\',
        \'fields\' => array (
            array (
                \'key\' => \'field_25\',
                \'label\' => \'Title\',
                \'name\' => \'form_post_title\',
                \'type\' => \'text\',
                \'default_value\' => \'\',
                \'formatting\' => \'html\',
            ),
        ),
        \'location\' => array (
            array (
                array (
                    \'param\' => \'post_type\',
                    \'operator\' => \'==\',
                    \'value\' => \'course\',
                    \'order_no\' => 0,
                    \'group_no\' => 0,
                ),
            ),
        ),
        \'options\' => array (
            \'position\' => \'normal\',
            \'layout\' => \'no_box\',
            \'hide_on_screen\' => array (
            ),
        ),
        \'menu_order\' => -2,
    ));
    register_field_group(array (
        \'id\' => \'acf_form-post-content\',
        \'title\' => \'Form Post Content\',
        \'fields\' => array (
            array (
                \'key\' => \'field_13\',
                \'label\' => \'Content\',
                \'name\' => \'form_post_content\',
                \'type\' => \'wysiwyg\',
                \'default_value\' => \'\',
                \'toolbar\' => \'full\',
                \'media_upload\' => \'yes\',
            ),
        ),
        \'location\' => array (
            array (
                array (
                    \'param\' => \'post_type\',
                    \'operator\' => \'==\',
                    \'value\' => \'course\',
                    \'order_no\' => 0,
                    \'group_no\' => 0,
                ),
            ),
        ),
        \'options\' => array (
            \'position\' => \'normal\',
            \'layout\' => \'no_box\',
            \'hide_on_screen\' => array (
            ),
        ),
        \'menu_order\' => -1,
    ));
}
这将添加所有代码,以支持可添加到前端表单的标题和内容字段,如下所示:

// Add this above get_header()
// This loads styles/scripts, but it also processes the form, so pretty important
acf_form_head();

get_header();

// Where 51 is the id of the ACF field group of meta box fields that I want to add
acf_form( array(
    \'field_groups\' => array(\'acf_form-post-title\', \'acf_form-post-content\', 51)
) );
我在这些天工作的大多数网站上都使用这种方法。我倾向于使用重力形式创建一个基本的帖子,然后我用ACF在前端和后端控制一切。最好的是,你可以从一个地方同时管理这一切。然而,值得注意的是ACF can be used to create a post 也我还没有使用它,但将在我的下一个项目中尝试使用它,这样我就可以使用完全的元访问进行创建。

就我个人而言,ACF是唯一一个没有重力形态的插件。

SO网友:helgatheviking

最简单的方法是使用类似忍者形态的东西,并进行以下付费扩展:

http://wpninjas.com/downloads/front-end-posting/

您也可以自己编写代码。基本上,您将创建一个表单,然后使用wp_insert_post() 创建完整帖子。

示例表单:

<form action="" id="primaryPostForm" method="POST">

    <fieldset>
        <label for="postTitle"><?php _e(\'Post Title:\', \'framework\') ?></label>

        <input type="text" name="postTitle" id="postTitle" class="required" />
    </fieldset>

    <fieldset>
        <label for="postContent"><?php _e(\'Post Content:\', \'framework\') ?></label>

        <textarea name="postContent" id="postContent" rows="8" cols="30" class="required"></textarea>
    </fieldset>


<fieldset>
    <input type="hidden" name="submitted" id="submitted" value="true" />

    <button type="submit"><?php _e(\'Add Post\', \'framework\') ?></button>
</fieldset>

然后在提交时,您会将其保存为类似以下内容:

if ( isset( $_POST[\'submitted\'] ) && isset( $_POST[\'post_nonce_field\'] ) && wp_verify_nonce( $_POST[\'post_nonce_field\'], \'post_nonce\' ) ) {

    if ( trim( $_POST[\'postTitle\'] ) === \'\' ) {
        $postTitleError = \'Please enter a title.\';
        $hasError = true;
    }

    $post_information = array(
        \'post_title\' => wp_strip_all_tags( $_POST[\'postTitle\'] ),
        \'post_content\' => $_POST[\'postContent\'],
        \'post_type\' => \'post\',
        \'post_status\' => \'pending\'
    );

    wp_insert_post( $post_information );

}
完整代码和教程来自:http://wp.tutsplus.com/tutorials/creative-coding/posting-via-the-front-end-inserting/

结束