修复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)版权所有,引用、转载时必须标明原文出处!

消息盒子
# 您需要首次评论以获取消息 #
# 您需要首次评论以获取消息 #

只显示最新10条未读和已读信息