Wordpress中的Ajax调用根本不起作用(500内部服务器错误)

时间:2014-03-14 15:02:35

标签: php jquery ajax wordpress internal-server-error

在自定义页面模板中进行Ajax调用的Wordpress方式令人难以置信。我不能让它运行而不会崩溃我的整个网站。为什么我需要那样做?我的其他Ajax调用也不需要这种复杂而复杂的方式。

所以我要做的是:

我想向商店添加一项功能,即经销商可以在那里输入ID并为商店重新订购新包。好长久。

我找到了目标网页:

    <?php
    /*
    Template Name: Cover M13 Page
    */
    ?>
    <?php
        get_header();
    ?>
    <section id="main" class="reseller-page">

    <form action="<?php echo get_stylesheet_directory_uri(); ?>/reseller.php" method="GET" id="resellerform">
        Reseller ID: <br><input type="text" name="rid" id="rid">
        <button id="resellercheck">SUCHEN</button>
    </form> 
    <div id="resellerwrapper" style="display: none;">
        <div id="resellerinfo"></div>

        <div id="resellerorder" style="display: none;">
            <h2>Bestellformular:</h2>
            <?php
            $args = array('post_type' => 'product', 'posts_per_page' => -1, 'product_cat' => 'tabak-taschen');
            query_posts($args);
            if (have_posts()):
                echo '<div id="reseller-select-wrapper"><select id="artikelselector">';
                while (have_posts()) : the_post();
                    echo '<option value="' . $product->get_sku() . ': ' . $product->get_title() . '" data-type-href="' . get_permalink() . '">' . $product->get_sku() . ': ' . $product->get_title() . '</option>';
                endwhile;
                echo '</select>Menge: <input id="reseller-menge" type="text" class="input-text"><button value="hinzufügen" id="reseller-add-to-form">+</button></div>';
            endif;
            ?>
            <form action="" method="POST" id="reseller-bestell-liste">
                <ul>

                </ul>
                <textarea name="nachricht" id="reseller-msg"></textarea>
                <input type="submit" id="reseller-send-order" value="bestellen" title="verbindliche Bestellung" />
            </form> 

        </div>
    </div>
</section>
<?php
get_footer();
?>

然后 checkresellerid.php ,如果RiD(ResellerID)在数据库中,则检查数据库:

<?php
//header('Content-Type: text/html; charset=utf-8');
include 'db_connect.php';

// Check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

if (isset($_GET['rid'])) {
//  $rid = "R10369";
$rid = $_GET['rid'];


$result = mysqli_query($con, "SELECT rid FROM reseller WHERE rid = '" . $rid . "'");

$ergebnis = mysqli_num_rows($result);

if ($ergebnis == 1) {
    $RJSON = [];
    $RQUERY = mysqli_query($con, "SELECT * FROM reseller WHERE rid = '" . $rid . "'");
    while ($row = mysqli_fetch_array($RQUERY, MYSQL_ASSOC)) {

        $RJSON[] = array(
//          'rid' => $row['rid'],
            'name' => $row['name'],
            'adresse' => $row['adresse'],
            'email' => $row['email'],
            'phone' => $row['phone']

        );
    }


    echo json_encode($RJSON);

} else {
    echo 'false';
}

mysqli_close($con);
}
?>

当我在输入字段中输入内容时(无论是否在数据库中),我都会收到500内部服务器错误。但是,为什么我的其他Ajax在网站上调用,就像我在woocommerce商店循环中的“爱一个产品”功能一样,但这不是一个小家伙吗?在我的localhost上是正确运行的一切。它有什么可做的,因为它是一个自定义的php文件(模板页面文件)?

查看示例页面 >>> Here <<<

我尝试在functions.php中注册一个函数但是崩溃了整个网站。 如何在这个functions.php中打包我的php脚本并正确调用它?为什么要使它复杂化甚至是必要的?我正在谷歌上搜索几个小时并尝试了很多方法,没有任何作用......

感谢您的帮助,感谢抱歉。

修改

我的functions.php看起来像这样:

<?php

/****************************************
Theme Setup
*****************************************/

require_once( get_template_directory() . '/lib/init.php' );
require_once( get_template_directory() . '/lib/theme-helpers.php' );
require_once( get_template_directory() . '/lib/theme-functions.php' );
require_once( get_template_directory() . '/lib/theme-comments.php' );


/****************************************
Require Plugins
*****************************************/

require_once( get_template_directory() . '/lib/class-tgm-plugin-activation.php' );
require_once( get_template_directory() . '/lib/theme-require-plugins.php' );

add_action( 'tgmpa_register', 'mb_register_required_plugins' );
add_theme_support( 'woocommerce' );


/****************************************
Misc Theme Functions
*****************************************/

/**
 * Define custom post type capabilities for use with Members
 */
function mb_add_post_type_caps() {
    // mb_add_capabilities( 'portfolio' );
}

/**
 * Filter Yoast SEO Metabox Priority
 */
add_filter( 'wpseo_metabox_prio', 'mb_filter_yoast_seo_metabox' );
function mb_filter_yoast_seo_metabox() {
    return 'low';
}


function checkResellerId(){
    include 'db_connect.php';
    wp_localize_script( 'function', 'checkResellerId', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );

    // Check connection
    if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }

    if (isset($_GET['rid'])) {
    //  $rid = "R10369";
        $rid = $_GET['rid'];


        $result = mysqli_query($con, "SELECT rid FROM reseller WHERE rid = '" . $rid . "'");

        $ergebnis = mysqli_num_rows($result);

        if ($ergebnis == 1) {
            $RJSON = [];
            $RQUERY = mysqli_query($con, "SELECT * FROM reseller WHERE rid = '" . $rid . "'");
            while ($row = mysqli_fetch_array($RQUERY, MYSQL_ASSOC)) {

                $RJSON[] = array(
    //              'rid' => $row['rid'],
                    'name' => $row['name'],
                    'adresse' => $row['adresse'],
                    'email' => $row['email'],
                    'phone' => $row['phone']

                );
            }


            echo json_encode($RJSON);

        } else {
            echo 'false';
        }

        mysqli_close($con);
    }
}

add_action( 'wp_ajax_nopriv_product_s', 'checkResellerId' );
add_action( 'wp_ajax_product_s', 'checkResellerId' );

function resellerMail(){
    wp_localize_script( 'function', 'resellerMail', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
    $zieladresse = 'dave@manufaktur13.de';

    $absenderadresse = 'M13-Reseller';

    $absendername = 'M13-Reseller';

    $betreff = 'Reseller-Bestellung';

    $trenner = ":\t";

    if ($_SERVER['REQUEST_METHOD'] === "POST") {

            $header = array();
            $header[] = "From: ".mb_encode_mimeheader($absendername, "ISO-8859-15", "Q")." <".$absenderadresse.">";
            $header[] = "MIME-Version: 1.0";
            $header[] = "Content-type: text/plain; charset=ISO-8859-15";
            $header[] = "Content-transfer-encoding: 8bit";

        $mailtext = "";

        foreach ($_POST as $name => $wert) {
            if (is_array($wert)) {
                        foreach ($wert as $einzelwert) {
                                $mailtext .= $name.$trenner.$einzelwert."\n";
                }
            } else {
                $mailtext .= $name.$trenner.$wert."\n";
            }
        }

        mail(
            $zieladresse, 
            mb_encode_mimeheader($betreff, "ISO-8859-15", "Q"), 
            $mailtext,
            implode("\n", $header)
        ) or die("Die Mail konnte nicht versendet werden.");
        echo $mailtext; // nur check für ajax response, später wieder entfernen!!!!
        echo 'Ihre Bestellung wurde an uns versandt.<br>Sie werden telefonisch von uns kontaktiert um die Bestellung zu bestätigen.';
        exit;
    }

//header("Content-type: text/html; charset=utf-8");
}

add_action( 'wp_ajax_nopriv_product_s', 'resellerMail' );
add_action( 'wp_ajax_product_s', 'resellerMail' );

500错误的屏幕: Screenshot 500 Internal error

1 个答案:

答案 0 :(得分:2)

好的,这个

有很多不同的问题

add_action()块看起来正确,所以很好!

然而:

你是如何包含运行ajax动作的javascript的?要使用wp_localize_script(),必须使用wp_enqueue_script()wp_register_script()加载脚本。

应该在注册脚本后调用

wp_localize_script(),通常在wp_enqueue_script()之后。目前您没有发布到admin-ajax.php,而是发布到主题目录中的文件。

如果您愿意,可以使用ajaxurl var在头部打印<script>并使用它,但这不是最佳做法。

我们调用checkResellerId()后,如果您将此数据存储在wordpress数据库中,则无需打开自己的数据库连接,您可以使用$wpdb SQL查询。

您正在寻找$ _GET,但如果您的javascript与您的表单匹配,则它将在$ _POST中。请改用$ _REQUEST。

主要问题:您正在将$ _GET数据直接传递到您的sql查询中,这使您可以完全接受sql注入!坏。

根据您的php版本,您可能无法使用$RJSON = [];来调用array()

echo json_encode之前,您应该使用header( "Content-Type: application/json" );

发送json标头

我还没有调查其他功能。


我建议制作一个非常简单的ajax动作,并在尝试运行更复杂的逻辑之前先使其工作,请参阅this tutorial