一些POST元字段在几次成功保存后停止保存

时间:2019-02-17 作者:Chris Chalmers

我只经历过几次:我有一个插件,其中包含许多页面和其他帖子类型的元字段。有时,update\\u post\\u meta()函数只对一个字段没有任何效果。其他字段工作正常。这是在磁场工作了几次之后,但它只是停止了。如果我进入代谢箱。php代码并更改字段名(meta\\u键),它们将再次开始工作。是什么导致了这种“冻结”的行为?

下面是我使用的save函数的一个示例:

在元数据库中。php:

function fws_meta_save( $post_id ) {

    // Checks save status
    $is_autosave = wp_is_post_autosave( $post_id );
    $is_revision = wp_is_post_revision( $post_id );
    $is_valid_nonce = ( isset( $_POST[ \'fws_nonce\' ] ) && wp_verify_nonce( $_POST[ \'fws_nonce\' ], basename( __FILE__ ) ) ) ? \'true\' : \'false\';

    // Exits script depending on save status
    if ( $is_autosave || $is_revision || !$is_valid_nonce ) {
        return;
    }

    //list of fields to save *this is connected to another feature that handles post revisions and isn\'t related
    $revision_field_array = Array(
        \'featured\',
        "type",
        "resource_type",
        "logo_header",
    ....more fields
    );

    foreach($revision_field_array as $field){
        if( isset( $_POST[ $field ] ) ) {
            update_post_meta( $post_id, $field, $_POST[ $field ] );
        }
    }
} add_action( \'save_post\', \'fws_meta_save\' );
因此,此保存功能适用于所有字段,偶尔有一个字段停止保存。当我在页面编辑屏幕中单击更新时,它只显示与之前相同的值。我已通过以下操作进行调试-例如,logo\\u标头字段已停止保存:

foreach($revision_field_array as $field){
    if( isset( $_POST[ $field ] ) ) {

        if($field == "logo_header"){
            error_log("old value: " . (string)get_post_meta( $post_id, $field, true )[0]);
            error_log("new value: " . $_POST[ $field ] );
        }

        update_post_meta( $post_id, $field, $_POST[ $field ] );

        if($field == "logo_header"){
            error_log("updated value: " . (string)get_post_meta( $post_id, $field, true )[0]);
        } );

    }
}
尝试保存后,日志显示:[2019年2月17日19:36:36 UTC]旧值:关[2019年2月17日19:36:36 UTC]新值:开[2019年2月17日19:36:36 UTC]更新值:关

所以我可以看到帖子包含了新的值,但它没有被保存。

一些背景:这是一个多站点网络上的博客,有20多个站点,运行在WP引擎上。PHP版本7.0 WP 5.0.3

我已将以下行添加到。htaccess增加post中的max\\U input\\U VAR

php_value max_input_vars 10000

1 个回复
最合适的回答,由SO网友:federico sgoifo 整理而成

WP引擎的服务器缓存可能会有点麻烦,它们有一个入侵性很强的缓存。尝试从服务器中删除缓存:

https://wpengine.com/support/cache/

为了进行调试,您可以打印

update_post_meta ($ post_id, $ field, $ _POST [$ field]);
(这将是true或false)因为get\\U post\\U meta有时不起作用,因为事实上,当您查询自定义字段时,该post的所有字段都是从数据库中检索的,通过对象缓存进行缓存,后续请求从缓存而不是从db中提取数据。

这也可能是优先级问题,请尝试以下方法:

add_action (\'save_post\', \'fws_meta_save\', 20, 1);

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在