• Resolved kmsgli

    (@kmsgli)


    Hey folks, new to plugin development and I imagine someone will be able to tell me exactly what is happening here rather easily.

    I did not attach a website link as it only shows the error on the back end and the code works as expected I just cant figure out why I am getting this error.

    I made a simple plugin that is an unsubscribe input box entry so when you put in an email address the server sends an email to the server admin that someone would like to unsubscribe (I know a plugin probably already exists for this but I am more trying to learn than anything else)

    here is my code;

    
    function email_unsubscribe(){
    echo "<form action='' method='post'>";
    echo "<input type='email' id='email' name='email'><br><br>";
    echo "<input type='submit'></form>";
    
    if (!empty($_POST)) {
        $email = $_POST['email'];
    
        echo $email;  ///just echo for testing so I dont get emails
        }
    
    }
    add_shortcode( 'unsubscribe', 'email_unsubscribe' );
    
    ?>
    

    When I use the shortcode [unsubscribe] and hit update I get the error;
    Updating failed. The response is not a valid JSON response.

    However when I go to that page the input box is there and it works correctly.
    I have noticed the echo command seems to be the reason this is happening.

    What am I missing?

Viewing 8 replies - 1 through 8 (of 8 total)
  • The error message you mentioned occurs when something is sent via AJAX and the data it contains is unexpected. My guess is that you have a JavaScript in your project that sends all form data via AJAX – but that’s not what you want in this case, you want to process them directly yourself first.

    My recommendation: deactivate all plugins and leave only your plugin active. Also use a standard theme like TwentyTwentyOne to test the function.

    Thread Starter kmsgli

    (@kmsgli)

    I have tried my plugin between two sites I maintain with the same issue and different themes on each site.

    Either way I have tried deactivating everything but the plugin I am working on and activating twenty twenty one theme.

    Still the issue persists.

    Unsure if this is helpful but I have multiple WordPress installations on one server using different folders for each website in the /srv/http/ folder (using Apache vhosts to direct traffic). This all works great and I have not had any issues setup this way however I read somewhere this error can arise if in the general settings you do not make site address example.com/root_of_wordpress_install/

    I tried this but it would not allow me to login as I kept site url with the scheme example.com/ as I do not want to change that for each site (had to go into the database and change the site address back to gain access again).

    Is this possibly my issue or am I going down the wrong path as my current setup works fine other then this strange issue?

    • This reply was modified 2 years, 5 months ago by kmsgli.
    Dion

    (@diondesigns)

    Try replacing if (!empty($_POST)) { with:

    if (!empty($_POST['email'])) {

    Your original code will throw a PHP notice (7.4-) or warning (8.0+) if $_POST exists but $_POST['email'] does not. I believe the Gutenberg editor uses POST requests to the REST API to display content, so the PHP notice/error would always be triggered.

    Moderator bcworkz

    (@bcworkz)

    I don’t see why echo would cause an error, but all the same you are not supposed to echo out (or produce any kind of output) from within a shortcode callback. Instead, collect all intended output into a single variable and return that variable.

    What could cause a problem is failing to return any sort of string value. Usually the only ill effect from echoing is the output ends up in the wrong place on the page. In some shortcode usage, location doesn’t make any noticeable difference. Even so, echoing is still doing it wrong.

    Now I just understand what is meant by “hit update”. If you paste the above code into functions.php and then try to use in the Gutenberg editor the shortcode

    [unsubscribe]

    in the Gutenberg editor and hit the update-button there, you will get an AJAX error because the echo output will cause the code to be executed immediately and output directly.

    Correct would be like this:

    function email_unsubscribe(){
        ob_start();
        echo "<form action='' method='post'>";
        echo "<input type='email' id='email' name='email'><br><br>";
        echo "<input type='submit'></form>";
    
        if ( ! empty( $_POST ) ) {
            $email = $_POST['email'];
    
            echo $email;  ///just echo for testing so I dont get emails
        }
        return ob_get_clean();
    }
    add_shortcode( 'unsubscribe', 'email_unsubscribe' );

    See also the manual for add_shortcode(), there is a comment that shows the way very well: https://developer.www.ads-software.com/reference/functions/add_shortcode/

    Thread Starter kmsgli

    (@kmsgli)

    @bcworkz I believe you are talking about something like this?

    $form_var = "<form action='' method='post'>
    <input type='email' id='email' name='email'><br><br>
    <input type='submit'></form>";
    
    return $form_var;

    That no longer gives an error but it does not post the results as expected when submit is hit.

    @threadi you solution works perfectly, just so I understand this is an issue with echo occurring to quickly so the ob_star() / ob_get() command places that function into a buffer and is executed later avoiding the issue entirely?

    The reason is mentioned in the manual entry I linked to add_shortcode:

    Note that the function called by the shortcode should never produce an output of any kind. Shortcode functions should return the text that is to be used to replace the shortcode.

    With the output buffer functions you collect the output and then return it via return from the callback function.

    Thread Starter kmsgli

    (@kmsgli)

    @threadi
    Thank you so much for your help, it is much appreciated I will mark this as resolved.

Viewing 8 replies - 1 through 8 (of 8 total)
  • The topic ‘Plugin echo error’ is closed to new replies.