# Roel asked if there was a post detailing how I set up the posting form. There is now...

Firstly, I've slimmed down the form a bit further by adding placeholder values rather than labels and adjusting the spacing. It now takes up less room at the top of the page. I've also added a toggle to show/hide the form with a quick bit of JavaScript and CSS.

Post Form

So, how does it work?

It's all relatively straightforward.

As mentioned yesterday, the elements are contained within if (current_user_can('edit_posts')) checks. The original form page had everything permanently visible but required a "key" to be entered so that only I could post. With this now being at the top of the home page (unless your default is the Today view) I obviously don't want it visible all the time. Hiding it with the current user check also means I can do away with the key.

The form is just regular HTML with its method set to "post" and no action so that it redirects back to the same page on submit. Inspired by micro.blog, the Title field is only shown if I change the post format to 'Post' rather than 'Status'.

Once submitted and after a quick sanity check I pull the required form values from the standard PHP $_POST variable and set up my core details:

$title = stripslashes($_POST['title']);
$body = stripslashes($_POST['body']);
$status = $_POST['status'];
$format = $_POST['format'];
$author_id = '346';
$comment_status = 'open';
$ping_status = 'open';
$post_date = gmdate("Y-m-d H:i");

If I am sending a "Like" webmention I enter the URL and the required text is added to the post as per my "Likes and Replies plugin" so I won't go in to those details here. Suffice it to say that this uses a custom field on posting.

With all the information in place I construct an array of 'post data'

$post_data = array(
  'post_type'      => 'post',
  'post_title'     => $title,
  'post_content'   => $body,
  'post_status'    => $status,
  'tax_input'      => array('post_format' => $format),
  'post_author'    => $author_id,
  'comment_status' => $comment_status,
  'ping_status'    => $ping_status,
  'post_date_gmt'  => $post_date,

and then use this at the parameter to insert a new post

$postID = wp_insert_post($post_data);

If the post is a draft I then redirect to the post preview, otherwise I just stay on the Daily page which will then have the shiny new post.

And that's it - there's not much to it and it's simpler than with the standalone page.

If I did decide to go the AJAX route things would get considerably more complex but I don't think I really need to. Besides, I've not done anything of that ilk for what seems like an eternity.

1 comment: click to readComments

# Maybe I've been messing around with the post form in some kind of forlorn hope that it will make me post more; if it's easier to post I should do so more often, right?

But easy doesn't mean worthy. Often quite the opposite.

It's just like my proclivity for installing different writing apps in the hope that I'll find the perfect workflow and all my problems will be solved. Yeah, right! It's just another form of procrastination, fiddling around the edges rather than getting on with what's needed.

Perhaps it will help, perhaps every time I load the blog the presence of the form will remind me to put down some words, whether they be here or elsewhere, but it alone cannot fix things.

1 comment: click to readComments

# One final update, which is only for my benefit when posting, is that it will now (hopefully) jump to the new post when published straight away rather than it being a draft.

Update: it works, albeit after a slight modification.

Update 2: no it doesn't. Back to the drawing board.

# I persist in using ALT+F, S to save on Windows but CMD+S on MacOS. I know CTRL+S is quicker so wonder why this is. Perhaps it's because ALT on a Windows keyboard is in the same location as CMD on a Mac.

# How has the "accesskey" HTML attribute managed to evade me for so long? ALT+T (or CTRL+ALT+T on Mac) now toggles the form display.

Colin Walker Colin Walker colin@colinwalker.blog