Обновление произвольных метаполей записи с помощью AJAX
Эта AJAX-функция вызывается при клике:
$.ajax({
url: 'site/ajax.php',
data: {id: $('section#single article input:last-of-type').attr('value'), cote: 'like'}
}).done(function(html) {}
Она передает ID записи (который содержится в скрытом поле input) для функции get_post_meta(), расположенной в ajax.php. Вот как выглядит 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);
}
Она должна обновлять произвольное поле "cote" записи, но проблема в том, что функция get_post_meta() не определена в ajax.php. Вот сообщение об ошибке:
Fatal error: Call to undefined function get_post_meta() in /home2/electro/public_html/beta... on line 2

Если вы загружаете файл напрямую, ни одна из функций WordPress не будет работать. Именно поэтому почти всегда следует использовать AJAX API. AJAX API решает эту проблему, так как все загружается в контексте 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
и передавайте my_update_pm
в качестве аргумента, когда JavaScript делает запрос.
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) {
// здесь можно выполнить нужные действия, возможно, ничего не требуется
});
Вы можете установить ajax_url
аналогично этому примеру из Codex:
add_action( 'admin_enqueue_scripts', 'my_enqueue' );
function my_enqueue($hook) {
if( 'index.php' != $hook ) return; // Применяется только к панели управления
wp_enqueue_script( 'ajax-script', plugins_url( '/js/my_query.js', __FILE__ ), array('jquery'));
// в JavaScript свойства объекта доступны как 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 ) );
}

Спасибо! Можете объяснить, пожалуйста: Отправьте ваш запрос на http://site/wp-admin/admin-ajax.php и передайте my_update_pm как аргумент, когда Javascript делает запрос. -- Что такое admin-ajax.php?

admin-ajax.php
- это файл, используемый AJAX-системой WordPress Core. Все запросы AJAX API должны отправляться по этому адресу.
