前端自定义帖子提交结果为wp_insert_post()未定义

时间:2016-05-15 15:53:51

标签: ajax wordpress frontend custom-post-type

我已经在这个问题上苦苦挣扎了几天,我真的希望你能帮助我。

我创建了一个插件,位于:

' /可湿性粉剂内容/插件/我的 - 冷却 - 插件'

我的插件允许用户通过公共页面上的表单发布自定义帖子类型,基本上任何人都应该能够发布内容。 使用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的范围内?'了吗? 或者是否有另一种(更好的)方式从前端表单插入自定义帖子?

3 个答案:

答案 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指出我正确的方向,我希望我的解决方案也能帮助别人。请注意,我已经删除了其他人的代码,以便其他人轻松了解代码的工作原理。