带有短代码的 Wordpress 插件导致白屏死机

Wordpress Plugin with shortcodes causes The White Screen Of Death

我写了一个插件,它按预期工作。它添加了一个简码侦听器并输出一些 HTML。问题是当我重新登录 wp-admin/ 时,我只看到死机白屏。如果我删除我的插件,Wordpress 工作正常。

代码如下:

<?php
/*
Plugin Name: Widgets
Plugin URI: http://dshatz.com
Description: A plugin for generating some website widgets
Version: 1.0
Author: Me
Author URI: http://dshatz.com
*/?>

<?php
function checkout_button_create(){
    $ec = @$_GET['ec'];
    $userId = @$_GET['id'];

    $c = mysqli_connect("localhost", "user", "pwd", "db");
    $stmt = $c->prepare("...");
    $stmt->bind_param("is", $userId, $ec);
    $stmt->execute();
    $payment_id = $c->insert_id;
    $stmt->close();

    $stmt = $c->prepare("...");
    $stmt->bind_param("i", $payment_id);
    $stmt->execute();
    $stmt->bind_result($name, $price);
    $stmt->fetch();
    $stmt->close();

$html = <<<EOD
<h1>$name</h1>
<form id="purchase_form" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank"><input name="cmd" type="hidden" value="_xclick" />
<input name="business" type="hidden" value="..." />
<input name="item_name" type="hidden" value="..." />
<input name="currency_code" type="hidden" value="EUR" />
<input name="amount" type="hidden" value="$price" />
<input name="custom" type="hidden" value="$payment_id"></input>
<input name="lc" type="hidden" value="EN_US" />
<input name="no_note" type="hidden" value="" />
<input name="paymentaction" type="hidden" value="sale" />
<input name="return" type="hidden" value="/licenses/purchased/" />
<input name="bn" type="hidden" value="WPPlugin_SP" />
<input name="cancel_return" type="hidden" value="/" />
<input class="paypalbuttonimage" style="border: none;" alt="Make your payments with PayPal. It is free, secure, effective." name="submit" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynowCC_LG.gif" type="image" />
<img style="border: none; display: none;" src="http://i2.wp.com/www.paypal.com/EN_US/i/scr/pixel.gif?resize=1%2C1&ssl=1" alt="" width="1" height="1" border="0" /></form>
EOD;
return $html;
}

function register_form_create(){
    $email = @$_GET['email'];
    if(!isset($email)) $email="";
    $ec = @$_GET['ec'];

    $html = <<<EOD
        <style>
          input{
              float: right;
          }
          form div{
              padding-bottom: 10px;
          }
          .error_indicator{
              color: red;
          }
        </style>
        <script type="text/javascript">
            function validateEmail(email) {
                var re = /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
                return re.test(email);
            }
            jQuery(document).ready(function(){
                jQuery("form.register_form").submit(function(e){
                    var fieldsOk = true;
                    var mailOk = false;
                    var mail = jQuery("input[type='email']", jQuery(this)); 
                    mailOk = validateEmail(jQuery(mail).val());

                    jQuery("input", jQuery(this)).each(function(index){
                        if(jQuery(this).val().length == 0) {
                            fieldsOk = false;
                            return;
                        }
                    });
                    if(fieldsOk) jQuery(".fill_in_pls").css("display", "none");
                    else {
                        jQuery(".fill_in_pls").css("display", "inline");
                        jQuery(".invalid_email").css("display", "none");
                        e.preventDefault();
                        return false;
                    }

                    if(!mailOk){
                        e.preventDefault();
                        jQuery(".invalid_email", jQuery(this)).css("display", "inline");
                        return false;
                    }
                    jQuery(".invalid_email", jQuery(this)).css("display: none;");
                    return ;  
                });
            });
        </script>
        <form class="register_form" method="POST" action="/license/register.php" style="width: 50%;">
            <div>
                <label for="email_input">Email</label><input id="email_input" type="email" name="email" value="$email"/>
            </div>
            <div>
                <label for="fname_input">First name</label><input id="fname_input" type="text" name="fname"/>
            </div>
            <div>
                <label for="lname_input">Last name</label><input id="lname_input" type="text" name="lname"/>
            </div>
            <input type="hidden" name="ec" value="$ec"/>
            <div>
                <input type="submit" value="Checkout"/>
            </div>
              <div class="error_indicator invalid_email" style="display: none;">Please enter a valid email</div>
              <div class="error_indicator fill_in_pls" style="display: none;">Please fill in all fields</div>
        </form>
EOD;
    return $html;
}

add_shortcode('register', 'register_form_create');
add_shortcode('checkout', 'checkout_button_create');
?>

当我在页面上插入短代码时,代码 运行 非常完美。是什么导致了这个可怕的白屏?

尝试一下,也许有用。

只需更换

var mail = jQuery("input[type='email']", jQuery(this));

var mail = jQuery("input[type=\'email\']", jQuery(this));

我添加了反斜杠。

完整插件代码:

<?php
/**
 * Plugin Name: Widgets
 * Plugin URI: http://danielpataki.com
 * Description: This plugin adds some Facebook Open Graph tags to our single posts.
 * Version: 1.0.0
 * Author: Daniel Pataki
 * Author URI: http://danielpataki.com
 * License: GPL2
 */
function checkout_button_create(){
    $ec = @$_GET['ec'];
    $userId = @$_GET['id'];

    $c = mysqli_connect("localhost", "user", "pwd", "db");
    $stmt = $c->prepare("...");
    $stmt->bind_param("is", $userId, $ec);
    $stmt->execute();
    $payment_id = $c->insert_id;
    $stmt->close();

    $stmt = $c->prepare("...");
    $stmt->bind_param("i", $payment_id);
    $stmt->execute();
    $stmt->bind_result($name, $price);
    $stmt->fetch();
    $stmt->close();

$html = '<h1>$name</h1>
<form id="purchase_form" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank"><input name="cmd" type="hidden" value="_xclick" />
<input name="business" type="hidden" value="..." />
<input name="item_name" type="hidden" value="..." />
<input name="currency_code" type="hidden" value="EUR" />
<input name="amount" type="hidden" value="$price" />
<input name="custom" type="hidden" value="$payment_id"></input>
<input name="lc" type="hidden" value="EN_US" />
<input name="no_note" type="hidden" value="" />
<input name="paymentaction" type="hidden" value="sale" />
<input name="return" type="hidden" value="/licenses/purchased/" />
<input name="bn" type="hidden" value="WPPlugin_SP" />
<input name="cancel_return" type="hidden" value="/" />
<input class="paypalbuttonimage" style="border: none;" alt="Make your payments with PayPal. It is free, secure, effective." name="submit" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynowCC_LG.gif" type="image" />
<img style="border: none; display: none;" src="http://i2.wp.com/www.paypal.com/EN_US/i/scr/pixel.gif?resize=1%2C1&ssl=1" alt="" width="1" height="1" border="0" /></form>';
return $html;
}

function register_form_create(){
    $email = @$_GET['email'];
    if(!isset($email)) $email="";
    $ec = @$_GET['ec'];

    $html = '<style>
          input{
              float: right;
          }
          form div{
              padding-bottom: 10px;
          }
          .error_indicator{
              color: red;
          }
        </style>
        <script type="text/javascript">
            function validateEmail(email) {
                var re = /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
                return re.test(email);
            }
            jQuery(document).ready(function(){
                jQuery("form.register_form").submit(function(e){
                    var fieldsOk = true;
                    var mailOk = false;
                    var mail = jQuery("input[type=\'email\']", jQuery(this)); 
                    mailOk = validateEmail(jQuery(mail).val());

                    jQuery("input", jQuery(this)).each(function(index){
                        if(jQuery(this).val().length == 0) {
                            fieldsOk = false;
                            return;
                        }
                    });
                    if(fieldsOk) jQuery(".fill_in_pls").css("display", "none");
                    else {
                        jQuery(".fill_in_pls").css("display", "inline");
                        jQuery(".invalid_email").css("display", "none");
                        e.preventDefault();
                        return false;
                    }

                    if(!mailOk){
                        e.preventDefault();
                        jQuery(".invalid_email", jQuery(this)).css("display", "inline");
                        return false;
                    }
                    jQuery(".invalid_email", jQuery(this)).css("display: none;");
                    return ;  
                });
            });
        </script>
        <form class="register_form" method="POST" action="/license/register.php" style="width: 50%;">
            <div>
                <label for="email_input">Email</label><input id="email_input" type="email" name="email" value="$email"/>
            </div>
            <div>
                <label for="fname_input">First name</label><input id="fname_input" type="text" name="fname"/>
            </div>
            <div>
                <label for="lname_input">Last name</label><input id="lname_input" type="text" name="lname"/>
            </div>
            <input type="hidden" name="ec" value="$ec"/>
            <div>
                <input type="submit" value="Checkout"/>
            </div>
              <div class="error_indicator invalid_email" style="display: none;">Please enter a valid email</div>
              <div class="error_indicator fill_in_pls" style="display: none;">Please fill in all fields</div>
        </form>';
    return $html;
}

add_shortcode('register', 'register_form_create');
add_shortcode('checkout', 'checkout_button_create');
?>