修复PIX主题所有独立页面都被插入落地页字段
前言
自定义字段是个好东西,文章、独立页面的各种特殊数据都会保存在这,比如点赞量、浏览量。
自定义字段使用方式
进入编辑页面,点击右上角三个点,点击菜单中的偏好设置,往下滑打开自定义字段,就可以在编辑页面的底部看到当前的所有字段,其中就包括浏览量、点赞量等信息,可以自行修改数据。
最近发现我无论使用什么模板创建独立页面,都会被强制插入“落地页”模板的自定义字段,甚至无法删除,只要点击保存就会自动添加这些字段。有点强迫症根本受不了,本文教大家怎么修复。
修复BUG
代码位置:pix\inc\assets\codestar-framework\classes\metabox-options.class.php : 318行左右
if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || ! wp_verify_nonce( $nonce, 'csf_metabox_nonce' ) ) {
return $post_id;
}
找到以上代码,在其下方添加以下代码
// 检查页面模板限制
if ( ! empty( $this->page_templates ) ) {
$saved_template = get_page_template_slug( $post_id );
$saved_template = ! empty( $saved_template ) ? $saved_template : 'default';
if ( ! in_array( $saved_template, $this->page_templates ) ) {
return $post_id;
}
}
问题原因:save_meta_box 方法没有检查页面模板限制,导致:
- 即使不是落地页,也会有这些字段数据
- 所有页面保存时都会写入 _pix_page_options 等自定义字段
批量清理
如果你有大量的独立页面不想一个一个删除字段,可以使用以下代码。
在主题根目录添加文件cleanup-landpage-meta.php
<?php
/**
* 清理非落地页页面的落地页自定义字段
* 将此文件放在主题目录下,访问一次后删除
*/
// 加载 WordPress
require_once( '../../../wp-load.php' );
// 安全检查:只允许管理员访问
if ( ! is_user_logged_in() || ! current_user_can( 'administrator' ) ) {
wp_die( '权限不足' );
}
// 全局 $wpdb
global $wpdb;
// 要删除的字段
$landpage_fields = array(
'land_type',
'land_dark',
'land_logo',
'land_feature',
'land_title',
'land_des',
'land_diy',
'land_html',
'land_btn'
);
// 获取所有页面
$pages = get_posts( array(
'post_type' => 'page',
'posts_per_page' => -1,
'post_status' => 'any',
) );
$deleted_count = 0;
$skipped_count = 0;
echo '<h2>清理落地页自定义字段</h2>';
echo '<pre>';
foreach ( $pages as $page ) {
$template = get_page_template_slug( $page->ID );
$template = ! empty( $template ) ? $template : 'default';
// 如果是落地页模板,跳过
if ( $template === 'page/landpage.php' ) {
echo "跳过落地页: {$page->post_title} (ID: {$page->ID})\n";
$skipped_count++;
continue;
}
// 删除落地页相关字段 - 直接从数据库删除(包括空值)
foreach ( $landpage_fields as $field ) {
// 先检查是否存在(包括空字符串)
$exists = $wpdb->get_var( $wpdb->prepare(
"SELECT meta_id FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = %s LIMIT 1",
$page->ID, $field
) );
if ( $exists ) {
// 直接执行 SQL 删除
$wpdb->query( $wpdb->prepare(
"DELETE FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = %s",
$page->ID, $field
) );
echo "删除字段 '{$field}' 从页面: {$page->post_title} (ID: {$page->ID})\n";
$deleted_count++;
}
}
}
echo '</pre>';
echo "<p><strong>完成!</strong> 跳过了 {$skipped_count} 个落地页,删除了 {$deleted_count} 个字段。</p>";
// 验证清理结果
echo '<h3>验证清理结果</h3>';
echo '<pre>';
$residual = 0;
foreach ( $pages as $page ) {
$template = get_page_template_slug( $page->ID );
$template = ! empty( $template ) ? $template : 'default';
if ( $template === 'page/landpage.php' ) {
continue;
}
foreach ( $landpage_fields as $field ) {
$exists = $wpdb->get_var( $wpdb->prepare(
"SELECT meta_id FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = %s LIMIT 1",
$page->ID, $field
) );
if ( $exists ) {
echo "残留: {$field} 在 {$page->post_title} (ID: {$page->ID})\n";
$residual++;
}
}
}
if ( $residual === 0 ) {
echo "没有残留字段,清理成功!\n";
} else {
echo "还有 {$residual} 个残留字段\n";
}
echo '</pre>';
echo "<p><strong>请删除此文件以确保安全。</strong></p>";
保存后访问页面https://你的域名/wp-content/themes/pix/cleanup-landpage-meta.php。批量清理所有非落地页的无关字段,清理后删除该文件。
总结
有强迫症的兄弟可以修复一下,批量清理一下会很爽,哈哈哈。
「摸鱼小屋」 (atmoyu.com)版权所有,引用、转载时必须标明原文出处!







空空如也!