我只经历过几次:我有一个插件,其中包含许多页面和其他帖子类型的元字段。有时,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
最合适的回答,由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);