The curious case of a Drupal Button
When using the #type =&gt; 'button' the submit callback is never executed, it already receives  a FALSE as default value.

Even if the submit callback is not executed, the validate callback is always executed (even on ajax posts). You can bypass this validation on a trigger element by using the #limit_validation_errors property.

In your case, you can set it on the body_words form element to only validate on this scope instead of the whole form.

$form['get_word_count'] = array(
    '#type' =&gt; 'button',
    '#value' =&gt; t('Update Count'),
    '#weight' =&gt; 5,
    '#limit_validation_errors' =&gt; array(
        array('body_words'),
    ),
    '#ajax' =&gt; array(
        'callback' =&gt; 'count_words',
    ),
);