我已经在这个问题上苦苦挣扎了几天,我真的希望你能帮助我。
我创建了一个插件,位于:
' /可湿性粉剂内容/插件/我的 - 冷却 - 插件'
我的插件允许用户通过公共页面上的表单发布自定义帖子类型,基本上任何人都应该能够发布内容。 使用jQuery,我听到提交前端表单时使用Ajax我将表单中的数据传递给php文件以将其处理成帖子。 该文件位于:
' /wp-content/plugins/my-cool-plugin/inc/processor.php' ;.
以下是我的处理器文件的内容:
$var1= $_POST['some'];
$var2= $_POST['data'];
$new_post = array(
'post_type' => 'my_custom_post',
'post_status' => 'publish',
'mcp_1' => $var1,
'mcp_2' => $var2
);
$post_id = wp_insert_post( $new_post, $wp_error );
if ($wp_error == 'false'){
$post_url = get_permalink( $post_id );
echo $post_url;
}else {
// some sort of error
}
当我测试表单时,会导致以下错误:
在线上调用未定义的函数wp_insert_post()...这是以下行:
$post_id = wp_insert_post( $new_post, $wp_error );
我是否需要提供一些内容,因为我不在WordPress的范围内?'了吗? 或者是否有另一种(更好的)方式从前端表单插入自定义帖子?
答案 0 :(得分:1)
为什么要运行wordpress范围内的文件?那不是最好的。相反,你可以在wordpress范围和用户wordpress本机ajax中运行它。
add_action('wp_ajax_yourplugin_create_post', 'yourplugin_create_post');
add_action('wp_ajax_nopriv_yourplugin_create_post', 'yourplugin_create_post');
function yourplugin_create_post() {
// your code here
}
然后你需要将你的ajax网址从php传递给js:
function your_plugin_ajaxurl() {
?>
<script type="text/javascript">
var yourPluginAjaxUrl = "<?php echo admin_url('admin-ajax.php'); ?>";
</script>
<?php
}
add_action('wp_head','your_plugin_ajaxurl');
然后你可以使用你的ajax请求,但是你需要指明一下动作:yourplugin_create_post和url = yourPluginAjaxUrl
答案 1 :(得分:0)
尝试添加
require(dirname(__FILE__) . '/wp-load.php');
答案 2 :(得分:0)
我花了一些时间来处理尼克的答案,但我终于开始工作了!就像Nick说的那样,我放弃了使用进程文件,因为它超出了WordPress的范围。正如尼克建议的那样,我将我的过程创建从我的过程文件移动到插件初始化文件(my-cool-plugin.php)中的新功能。这导致了以下新功能:
add_action('wp_ajax_coolplugin_create_post', 'coolplugin_create_post');
add_action('wp_ajax_nopriv_coolplugin_create_post', 'coolplugin_create_post');
function coolplugin_create_post() {
$var1 = $_POST['some'];
$var2 = $_POST['data'];
$new_post = array(
'post_type' => 'my_custom_post',
'post_status' => 'publish'
'post_title' => 'Some title'
);
$post_id = wp_insert_post( $new_post, $wp_error );
// check if there is a post id and use it to add custom meta
if ($post_id) {
update_post_meta($post_id, 'mcp_1', $var1);
update_post_meta($post_id, 'mcp_2', $var2);
}
if ($wp_error == false){
$post_url = get_permalink( $post_id );
echo $post_url;
}else {
// some sort of error
}
}
我还必须更改将自定义值插入新创建的帖子的方式,因为wp_insert_post()
函数只接受默认的帖子参数(请参阅wp_insert_post documentation了解这些参数)。
在我的插入/创建帖子功能旁边,我还必须对我的javascript文件进行一些调整,该文件从我的表单中检索填充的数据。因此(正如尼克建议的那样)我需要通过将以下函数添加到my-cool-plugin.php
来将我的Ajax URL从PHP传递给JS:
function your_plugin_ajaxurl() { ?>
<script type="text/javascript">
var coolPluginAjaxUrl = "<?php echo admin_url('admin-ajax.php'); ?>";
</script>
<?php }
add_action('wp_head','your_plugin_ajaxurl');
通过将coolPluginAjaxUrl
变量添加到头部,我可以使用我的javascript中的网址将数据发布到我的表单提交时,如下所示:
$( '#form' ).on( 'submit', function(e) {
var request;
e.preventDefault();
var val_one = $( '#val-one' ).val();
var val_two = $( '#val-two' ).val();
var formData = {
action: 'coolplugin_create_post',
some: val_one,
data: val_two,
};
request = $.ajax({
type: 'POST',
url: coolPluginAjaxUrl,
data: formData,
});
});
formData
保存在PHP中定义的coolplugin_create_post
操作,请求将发布到头部定义的coolPluginAjaxUrl
网址。
感谢Nick指出我正确的方向,我希望我的解决方案也能帮助别人。请注意,我已经删除了其他人的代码,以便其他人轻松了解代码的工作原理。