web-dev-qa-db-ja.com

Ajaxを使ってカスタム投稿メタを更新する

このAJAX関数はクリックで呼び出されます。

$.ajax({
            url: 'site/ajax.php',
            data: {id: $('section#single article input:last-of-type').attr('value'), cote: 'like'}
        }).done(function(html) {}

Ajax.phpにある関数get_post_meta()に投稿のID(隠し入力に含まれています)を渡します。これがAJAX.phpのようなものです。

$cote = get_post_meta($_GET['id'], 'cote', true);
if($_GET['cote'] == 'like') {
    $newCote = $cote++;
    update_post_meta($_GET['id'], 'cote', $newCote);
} else {
    $newCote = $cote--;
    update_post_meta($_GET['id'], 'cote', $newCote);
}

カスタム投稿の「コート」フィールドを更新することを想定していますが、問題は、関数get_post_meta()がajax.phpでは未定義であることです。これはエラーメッセージです:

Fatal error: Call to undefined function get_post_meta() in /home2/electro/public_html/beta... on line 2
5
user25893

ファイルを直接ロードした場合、WordPressの機能はどれも機能しません。そのため、ほとんど常にAJAX AP​​Iを使用する必要があります。 AJAX AP​​I はこの問題を解決します。すべてがWordPressのコンテキストにロードされます。

あなたの処理をラップするでしょうPHPは関数です:

function my_ajax_cb_wpse_108143() {
    $cote = get_post_meta($_POST['id'], 'cote', true);
    if($_POST['cote'] == 'like') {
        $newCote = $cote++;
        update_post_meta($_POST['id'], 'cote', $newCote);
    } else {
        $newCote = $cote--;
        update_post_meta($_POST['id'], 'cote', $newCote);
    }
}

それをAJAXシステムにフックします。

add_action('wp_ajax_my_update_pm', 'my_ajax_cb_wpse_108143');
add_action('wp_ajax_nopriv_my_update_pm', 'my_ajax_cb_wpse_108143');

リクエストがhttp://site/wp-admin/admin-ajax.phpに送信され、Javascriptがリクエストを行うときにmy_update_pmを引数として渡します。

var data = {
    action: 'my_update_pm',
    id: jQuery('section#single article input:last-of-type').attr('value'), 
            cote: 'like'
};
jQuery.post(ajax_url, data, function(response) {
    // whatever you need to do; maybe nothing
});

Codexからajax_urlをこれと同じように設定できます。

add_action( 'admin_enqueue_scripts', 'my_enqueue' );
function my_enqueue($hook) {
    if( 'index.php' != $hook ) return;  // Only applies to dashboard panel
    wp_enqueue_script( 'ajax-script', plugins_url( '/js/my_query.js', __FILE__ ), array('jquery'));
    // in javascript, object properties are accessed as ajax_object.ajax_url, ajax_object.we_value
    wp_localize_script( 'ajax-script', 'ajax_object',
            array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'we_value' => $email_nonce ) );
}
7
s_ha_dum