将代码放置在用于挂钩`save_post`的插件中

时间:2013-03-01 作者:fischi

今天我在开发一个新插件时遇到了一个奇怪的问题。

我像往常一样设置它,创建f711-roomprice Plugindirectory中的文件夹,并创建f711-roomprice.php 以及inc 目录在那里。

激活挂钩和包含的函数一切正常,直到我创建了一个包含:

include(\'inc/filter-savepost.php\');
此文件包含以下代码:

add_action( \'save_post\', \'f711_roomprice_meta_box_save\' );  
function f711_roomprice_meta_box_save( $post_id ) {

    if( !isset( $_POST[\'f711_roomprice_prices\'] ) ) return;

    if( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return; 

    if( !isset( $_POST[\'meta_box_nonce\'] ) || !wp_verify_nonce( $_POST[\'meta_box_nonce\'], \'f711_roomprice_box_nonce\' ) ) return; 

    if( !current_user_can( \'edit_post\', $post_id ) ) return;

    foreach( $_POST[\'f711_roomprice_prices\'] as $room => $seasons ) {
        foreach( $seasons as $season => $price ) {

            f711_roomprice_insert( $room, $season, $price );

        }

    }

}  
在我的主插件文件中包含该文件后,我出现了一个错误,导致在保存帖子时出现了一个白色屏幕,其他一切正常。

功能f711_roomprice_meta_box_save 已调用,并用wp_die(\'f711_roomprice_meta_box_saveis called\') 在那里。

现在最奇怪的是,我将代码(与include文件中的代码完全相同)放在主插件文件中,当然跳过了include。现在,它的工作就像我想要的那样。

我还试着添加save_post 主插件文件中的操作,包括inc/filter-savepost.php, 还是像以前一样得到了错误的结果。

我做错了什么?代码(挂钩、函数)在插件中的位置真的很重要吗,还是我自己出了问题?

2 个回复
最合适的回答,由SO网友:fischi 整理而成

浏览我以前的问题,我重新打开了这个问题,并在插件中测试了一些东西。

解决方案非常简单,但我不确定这是否与新版本的WordPress有关。

我重构了插件,并注意到与上次测试时不同的编码。我不知道我怎么会没有意识到这一点。现在,一切UTF-8 without BOM, 并且很好地组织到不同的文件中(正如计划的那样),它工作得很好。

SO网友:kaiser

我不确定

if( !current_user_can( \'edit_post\', $post_id ) ) return;
真的很有效。可能当前用户没有在那里设置,您必须通过在隐藏字段中传递用户ID,然后使用

$user = get_user_by( \'id\', esc_attr( $_POST[\'user_id\'] ) );
wp_set_current_user( $user->user_id );
if ( ! current_user_can( \'edit_post\', $post_id )
    wp_die( \'Not allowed\' );

结束

相关推荐

Per theme plugins?

我正在构建一个插件,它可以对博客页面的评论部分进行大量修改。它认为我不能用一种适用于所有主题的方式来实现这一点——根据使用的特定主题,必须调整一些CSS。我猜在将来,插件还会在数据库中存储一些数据。所以我想它应该是一个插件,而不是一个主题。(?)因此,这些问题:有没有可能以某种方式表明插件只能处理这个主题和那个主题?然后发布一些相当简单的插件版本,每个版本都针对一组特定的主题进行了调整?或者插件应该与。。。是否存在所有主题?除了按主题插件和/或分叉和修改现有主题之外,你能想出其他解决方案吗?也许是儿童主题