每个wp_ins_post的自定义插件不起作用

时间:2021-08-31 作者:jozs2021

对不起,我会说一点英语。

为什么不可行?

我的插件:~/wp-content/plugins/myplugg/myplugg。php

<?php
/**
 * Plugin Name: mypluggg
 */
    function videos() {
        // file_get_content()
        // $http_response_header
        $postarr = array();
        foreach( $videos as $key=> $video ) {
            $postarr [ $key ] = array( // etc.
            wp_insert_post( $postarr [ $key ], $wp_error );
        }
    }
    videos();
?>
添加1个post,然后添加错误屏幕:

https://i.imgur.com/MlxcTsW.png

此网站出现严重错误。Learn more about troubleshooting WordPress.

为什么?

UPDATE(1):

foreach( $videos as $key=> $video ) {

    $postarr [ $key ] = array(

        \'post_title\'=> $videos [ \'title\' ] [ $key ],
        \'post_content\'=> \'<iframe src="https://*.com/\' . $videos [ \'id\' ] [ $key ] . \'" frameborder=0 width=510 height=400 scrolling=no allowfullscreen=allowfullscreen></iframe>\',
        \'post_status\'=> \'publish\',
        \'post_author\'=> 1,

        \'meta_input\'=> array(

            \'site\'=> \'*.com\',
            \'video_id\'=> $videos [ \'id\' ] [ $key ],
            \'thumbnail\'=> $thumbnail,
            \'video_url\'=> $video_url,
            \'iframe_src_start\'=> \'https://*.com/embedframe/\',
            \'iframe_src_end\'=> \'\',
            \'v_tag\'=> $tag

        )

    );

}

UPDATE(2):

我的~/error\\u日志文件(我不调用is\\u user\\u logged\\u函数):

[31-Aug-2021 15:16:22 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function is_user_logged_in() in /home/x/public_html2/y/public_html/wp-includes/post.php:2793
Stack trace:
#0 /home/x/public_html2/y/public_html/wp-includes/post.php(7359): _count_posts_cache_key(\'post\', \'readable\')
#1 /home/x/public_html2/y/public_html/wp-includes/class-wp-hook.php(303): _transition_post_status(\'publish\', \'new\', Object(WP_Post))
#2 /home/x/public_html2/y/public_html/wp-includes/class-wp-hook.php(327): WP_Hook->apply_filters(\'\', Array)
#3 /home/x/public_html2/y/public_html/wp-includes/plugin.php(470): WP_Hook->do_action(Array)
#4 /home/x/public_html2/y/public_html/wp-includes/post.php(5098): do_action(\'transition_post...\', \'publish\', \'new\', Object(WP_Post))
#5 /home/x/public_html2/y/public_html/wp-includes/post.php(4368): wp_transition_post_status(\'publish\', \'new\', Object(WP_Post))
#6 /home/x/public_html2/y/public_html in /home/x/public_html2/y/public_html/wp-includes/post.php on line 2793

UPDATE(3):

不工作,我看到错误屏幕(https://i.imgur.com/MlxcTsW.png):

$ID = wp_insert_post( $postarr [ $key ], $wp_error );
if( ! is_wp_error( $ID ) ) {} else {
    echo $ID-> get_error_message();
} else {}

UPDATE(4):

我尝试创建新的测试自定义插件,但问题是相同的。完整代码:

~/wp内容/插件/mypluk/mypluk。php

<?php

/**
 * Plugin Name: mypluk
 */

    function videoss() {

        $postarr = array();

        foreach( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 ) as $key ) {

            $postarr [ $key ] = array(

                \'post_title\'=> \'title\' . $key

            );

            $ID = wp_insert_post( $postarr [ $key ], $wp_error );

        }

    }

    videoss();

?>

1 个回复
SO网友:Sally CJ

从您的代码和错误日志中可以看出,问题是您的插件正在调用wp_insert_post() 太早了,在函数之前is_user_logged_in() 或在加载其定义的文件之前,调用videos()videoss() (其中调用wp_insert_post()), 该文件尚未加载,因此,PHP抛出了致命错误,即对未定义函数的调用是\\u user\\u logged\\u in()";。

我的~/error\\u日志文件(我不调用is\\u user\\u logged\\u函数):

是的,也许你没有,但是,wp_insert_post() 调用wp_transition_post_status() 如果检查错误日志条目中的堆栈跟踪,则会发生以下情况:

  1. wp_transition_post_status() 启动了transition_post_status

    然后这个钩子调用了它的一个注册回调,即_transition_post_status().

    最后,该函数调用_count_posts_cache_key() 就是那个打电话来的is_user_logged_in().

    作为对您评论的回应:(*为了简洁起见,我将其格式化)

    第一个$postarr 大堆wp_insert_post 没关系,但需要更多的帖子foreach 环为什么只有第一个?添加了第一篇帖子,请参见错误屏幕。

    第一个成功的原因是因为帖子已经添加到数据库中before 帖子状态已转换,但无法创建其他(26)帖子,因为wp_transition_post_status() 调用时,PHP抛出上述致命错误,因此WordPress显示error screen.

    那么你如何解决这个问题呢

    基本上很简单:使用像plugins_loaded, initwp_loaded 运行videos()videoss() 函数(问题中有两个插件),不要简单地调用与调用相同的函数wp_insert_post() 直接从主插件文件的根目录。

    例如,使用init 挂钩,英寸mypluggg.php, 呼叫videos() 像这样:

    add_action( \'init\', \'mypluggg_create_posts\' );
    function mypluggg_create_posts() {
        videos();
    }
    // or yes, this would work as well..
    //add_action( \'init\', \'videos\' );
    
    但是,请注意init (以及上面提到的其他2个钩子)在每次页面加载时都会运行,因此您最好寻找另一种方法来创建您想要创建的帖子,例如,您可以使用cron jobWP-CLI, 但这是另一个故事。:)

    此外,如果您愿意wp_insert_post() 返回WP_Error 实例/对象如果后期创建/更新未成功,则将第二个参数设置为true 像这样:wp_insert_post( $postarr[ $key ], true ), 或者你可以使用$wp_error, 但请确保定义了该变量。例如。

    $wp_error = true; // here, define it
    
    foreach ( $videos as $key => $video ) {
        $postarr[ $key ] = array( ... );
    
        // pass $wp_error as the 2nd parameter
        $id = wp_insert_post( $postarr[ $key ], $wp_error );
    
        if ( is_wp_error( $id ) ) {
            error_log( \'Error creating post! Message: \' . $id->get_error_message() );
        }
    }
    

相关推荐