一段时间以来,我一直在应用和更新一些公司在不同网站上重复使用的自定义元数据库。(不同的代谢箱,但方法相同。)
本质上,它允许将不同自定义帖子类型的单个帖子与默认WP页面和帖子进行“关联”。
比如说Post ID = 449
这是一个Post Type = CustomA
可以分配给任何页面或帖子。
我所做的一切都很有效。它已经工作了很长时间了。它仍然有效。
然而,我们开始看到的是,在奇怪的情况下,其中一个页面/帖子将看到所有自定义帖子元从页面中清除。
我自己从来都无法复制这个错误。我只得到了URL,可以编辑自定义帖子元所在的帖子或页面的屏幕,现在它不见了。
我曾多次尝试在监视开发人员控制台时强制解决问题,并尝试触发一些可以使其发生的事情,但我无法触发它。
错误日志为空。(每隔几天就会有一个奇怪的警告,但与讨论中的任何帖子或功能无关。)
<?php
//ADD CPT SELECTION METABOX TO PAGES AND POSTS
function cpt_add_cpt_selection() {
$screens = [\'page\', \'post\'];
foreach( $screens as $screen ) {
add_meta_box(
\'cpt_assignment\',
\'Assign A Custom Post Type\',
\'cpt_assign_metabox\',
$screen,
\'side\',
\'low\',
array(
\'__block_editor_compatible_meta_box\' => true,
\'__back_compat_meta_box\' => false,
)
);
}
}
add_action( \'add_meta_boxes\', \'cpt_add_cpt_selection\' );
//QUICK LINKS SELECTION METABOX OPTIONS
function cpt_assign_metabox( $post ) {
wp_nonce_field( basename( __FILE__ ), \'cpt_nonce\' );
$cpt_position = get_post_meta( $post->ID, \'cpt_position\', true );
$cpt_appended_cpts = get_post_meta( $post->ID, \'cpt_cpts\', false );
?>
<label for="cpt_position_sidebar" style="display:block;margin-bottom:0.5rem;">
<input type="radio" id="cpt_position_sidebar" name="cpt_position" value="sidebar" <?php checked( \'sidebar\' == $cpt_position ); ?>/> Display in Sidebar
</label>
<label for="cpt_position_content" style="display:block;margin-bottom:0.5rem;">
<input type="radio" id="cpt_position_content" name="cpt_position" value="content" <?php checked( \'content\' == $cpt_position ); ?>/> Display below Content
</label>
<select id="cpt_cpts" name="cpt_cpts[]" multiple="multiple" style="width:90%;">
<?php
if( $cpt_appended_cpts ) {
foreach( $cpt_appended_cpts as $cpt_ids ) {
foreach( $cpt_ids as $cpt_id ) {
$cpt_title = get_the_title( $cpt_id );
$cpt_title = ( mb_strlen( $cpt_title ) > 50 ) ? mb_substr( $cpt_title, 0, 49 ) . \'...\' : $cpt_title;
echo \'<option value="\' . $cpt_id . \'" selected="selected">\' . $cpt_title . \'</option>\';
}
}
}
?>
</select>
<?php }
//SAVE THE CPT ASSIGNMENT FIELDS TO POSTS AND PAGES.
function cpt_assign_save_postdata( $post_id ) {
if( isset( $_POST[\'cpt_cpts\'] ) ) {
update_post_meta( $post_id, \'cpt_cpts\', $_POST[\'cpt_cpts\'] );
} else {
delete_post_meta( $post_id, \'cpt_cpts\' );
}
if( isset( $_POST[\'cpt_position\'] ) ) {
update_post_meta( $post_id, \'cpt_position\', $_POST[\'cpt_position\'] );
} else {
delete_post_meta( $post_id, \'cpt_position\' );
}
}
add_action( \'save_post\', \'cpt_assign_save_postdata\' );
//AJAX QUERY FOR POSTS USING SELECT2
function cpt_get_cpts_ajax_callback() {
$return = array();
$search_results = new WP_Query( array(
\'s\' => $_GET[\'q\'],
\'post_type\' => \'the_custom_cpt_in_question\',
\'post_status\' => \'publish\',
\'ignore_sticky_posts\' => 1,
\'posts_per_page\' => -1
) );
if( $search_results->have_posts() ) :
while( $search_results->have_posts() ) : $search_results->the_post();
$title = ( mb_strlen( $search_results->post->post_title ) > 50 ) ? mb_substr( $search_results->post->post_title, 0, 49 ) . \'...\' : $search_results->post->post_title;
$return[] = array( $search_results->post->ID, $title );
endwhile;
endif;
echo json_encode( $return );
wp_die();
}
add_action( \'wp_ajax_getcustompt\', \'cpt_get_cpts_ajax_callback\' );
就像我说的,它实际上在起作用。每天,在许多大型网站上,人们都在添加和删除一些与不同帖子和页面关联的自定义帖子类型。CPT本身是“FAQ”或“团队成员”之类的东西,使用的主题应用了模板标记,如果有CPT分配给页面,则会显示CPT的内容。一切正常。
一个异常情况是,可能每3-4周一次,一个填充了这些字段的页面(包括指定内容是否应应用于侧栏或内容下方的字段)会从Posteta表中清除。
(使用两个不同的模板标记,在检索任何内容之前运行条件检查,以确定分配的CPT是应显示在侧栏中还是应显示在内容下方。)
我的两个理论都是我无法复制的:
在“更新”过程完成之前,用户正在离开页面。但我一直在尝试,每次我这样做,页面仍然有自定义的帖子元。
我们使用WPML,人们会打开多个标签页,而且通常会使用不同的语言(我们所有的客户端网站都是双语的),我注意到这有时会导致后端的事情变得混乱。。。您开始使用一种语言进行编辑,用另一种语言检查新选项卡中的内容,返回到您正在编辑的第一页,您的搜索不再工作,因为搜索是用您最近打开的选项卡的语言执行的,该选项卡设置了语言cookie。
所以,我的问题是,是否有人在我的元数据库和保存过程中看到了可能导致偶尔清除帖子/页面上的Posteta的内容?
(耐心等待SallyCJ.。-P)
P、 我知道有一种不同的方法来构建这些元数据库,我也正计划这样做,但以我目前的工作量,我没有时间停止新项目的工作,重新审视表面上有效的东西。我也不知道使用新的基于反应的代谢箱是否能解决我们间歇性遇到的问题。