我想使用wp_remote_post() 在函数中,向插件中的php脚本发送HTTP Post请求。
我正在成功地发布到插件脚本,但在请求的上下文方面遇到了问题。
在里面functions.php:
function post_to_plugin($name, $email) {
$plugin_url = plugins_url( \'/my-plugin/db-insert.php\' );
$form = array( \'name\' => $name, \'email\' => $email );
$result = wp_remote_post(
$plugin_url,
array(
\'body\' => $form
)
);
}
示例
/my-plugin/db-insert.php:
if (preg_match(\'#\' . basename(__FILE__) . \'#\', $_SERVER[\'PHP_SELF\'])) { die(\'You are not allowed to call this page directly.\'); }
if (isset($_POST[\'name\']) && isset($_POST[\'email\'])) {
global $wpdb;
$wpdb->insert(
\'table\',
array (
\'name\' => $_POST[\'name\'],
\'email\' => $_POST[\'email\']
)
);
}
我的post请求被数据库插入中的第一行停止。php。我可以删除这条线,这不是一个好的解决方案。但是后来
insert
仍然失败,因为插入db。php无法找到
global $wpdb
. 是否可以在wordpress/插件脚本的适当上下文中发出此post请求?
最合适的回答,由SO网友:TheDeadMedic 整理而成
你不应该直接发布到你的插件文件——WordPress不会被加载,你也不应该手动加载它。
使用AJAX API和动作挂钩来处理它(注意,它不需要是实际的AJAX请求):
function wpse_180814_post_to_plugin( $name, $email ) {
$result = wp_remote_post(
admin_url( \'admin-ajax.php\' ),
array(
\'body\' => array(
\'action\' => \'wpse_180814_action\',
\'name\' => $name,
\'email\' => $email,
),
)
);
}
function wpse_180814_action() {
if ( isset( $_POST[\'name\'], $_POST[\'email\'] ) ) {
global $wpdb;
$wpdb->insert(
\'table\',
array (
\'name\' => $_POST[\'name\'],
\'email\' => $_POST[\'email\']
)
);
}
}
add_action( \'wp_ajax_nopriv_wpse_180814_action\', \'wpse_180814_action\' );
add_action( \'wp_ajax_wpse_180814_action\', \'wpse_180814_action\' );