You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

页面刷新后自定义表格样式失效问题求助

WordPress插件表格样式失效问题修复

问题现象

开发WordPress插件时,点击Gutenberg/Elementor生成按钮后,JS动态添加的表格行能正常应用custom-table-row等自定义样式;但刷新页面后,PHP从$generated_pages读取数据循环渲染的表格行,样式完全不生效。

相关代码

前端页面与动态添加逻辑

public function woosterPartnerPluginSection()
{
?>
    <section class="presentation-content">
<?php
    do_settings_sections('wooster_gutenberg');
?>
            <h2>页面生成器</h2>
            <p>选择您偏好的页面构建器:</p> <?php
    do_settings_sections('wooster_form');
    // 根据Elementor插件是否激活条件显示按钮
    if ($this->ispluginElementorActive()) {
?>
            <!-- 显示Gutenberg和Elementor按钮 -->
                <div style="display: flex;">
                    <form method="POST" action="">
                        <input type="hidden" name="submit-gutenberg" value="Gutenberg">
                        <input type="image" id="gutenberg_button" src="<?php echo plugins_url('assets/img/Gutenberg.png', __FILE__); ?>" alt="Gutenberg" width=100% height=100% />
                    </form>
                    <form method="POST" action="">
                        <input type="hidden" name="submit-elementor" value="Elementor">
                        <input type="image" id="elementor_button" src="<?php echo plugins_url('assets/img/Elementor.png', __FILE__); ?>" width=100% height=100% />
                    </form>
                </div>

<?php 
    } else { 
?>
                <div style="display: flex;">
                    <form method="POST" action="">
                        <input type="hidden" name="submit-gutenberg" value="Gutenberg">
                        <input type="image" id="gutenberg_button" src="<?php echo plugins_url('assets/img/Gutenberg.png', __FILE__); ?>" width=100% height=100% />
                    </form>
                </div>
<?php
}
?>

        <div class="results-info">
<?php
    $generated_pages = get_option('wooster_generated_pages', array());
    $num_generated_pages = count($generated_pages);
    echo '结果数量:' . $num_generated_pages;
?>
        </div>
        <div id="notification" class="notification">
            页面生成成功
        <table class="custom-table">
            <thead>
                <tr>
                <th scope="col" id="date" class="manage-column column-date">标题</th>
                    <th scope="col" id="date" class="manage-column column-author">日期</th>
                    <th scope="col" id="constructor" class="manage-column column-author">构建器</th>
                    <th scope="col" id="actions" class="manage-column column-actions">操作</th>
                </tr>
            </thead>
            <tbody id="generated-pages">
            </tbody>
        </table>
<script>
document.addEventListener('DOMContentLoaded', (event) => {
function updatePageWithNewPost(data, buttonValue, postId) {
    const tableRow = document.createElement('tr');
    tableRow.id = 'post-' + data.id;
    tableRow.classList.add('custom-table-row');

    const titleCell = document.createElement('td');
    titleCell.textContent = data.title;

    const constructorCell = document.createElement('td');
    constructorCell.textContent = buttonValue;

    const dateCell = document.createElement('td');
    dateCell.textContent = data.date;

    const actionsCell = document.createElement('td');
    actionsCell.classList.add('actions');

    const viewButton = document.createElement('button');
    viewButton.classList.add('viewBtn');
    viewButton.innerHTML = '<i class="fas fa-eye fa-lg"></i>';
    viewButton.dataset.previewUrl = data.previewUrl;

    viewButton.addEventListener('click', () => {
        const previewUrl = viewButton.dataset.previewUrl;
        window.location.href = previewUrl;
    });

    const editButton = document.createElement('button');
    editButton.classList.add('editBtn');
    editButton.innerHTML = '<i class="fas fa-edit fa-lg"></i>';
    editButton.addEventListener('click', () => {
        const editUrl = '<?php echo admin_url('post.php?action=edit&post='); ?>' + data.id;
        window.location.href = editUrl;
    });

    const deleteButton = document.createElement('button');
    deleteButton.classList.add('deleteBtn');
    deleteButton.innerHTML = '<i class="fas fa-trash-alt fa-lg"></i>';
    deleteButton.dataset.postId = data.id;

    deleteButton.addEventListener('click', function() {
        const postId = this.dataset.postId;
        const rowToDelete = this.closest('tr');

        if (confirm('确定要删除该文章吗?')) {
            fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded',
                    },
                    body: 'action=delete_post&id=' + postId,
                })
                .then(response => response.json())
                .then(data => {
                    if (data.success) {
                        rowToDelete.remove();
                    } else {
                        console.error('删除文章时出错');
                    }
                })
                .catch(error => {
                    console.error('错误:', error);
                });
        }
    });

    actionsCell.appendChild(viewButton);
    actionsCell.appendChild(editButton);
    actionsCell.appendChild(deleteButton);

    tableRow.appendChild(titleCell);
    tableRow.appendChild(dateCell);
    tableRow.appendChild(constructorCell);
    tableRow.appendChild(actionsCell);

    document.getElementById('generated-pages').appendChild(tableRow);
}

const gutenbergButton = document.getElementById('gutenberg_button');
const elementorButton = document.getElementById('elementor_button');

const gutenbergForm = gutenbergButton.closest('form');
const elementorForm = elementorButton.closest('form');

const forms = [gutenbergForm, elementorForm];

forms.forEach(form => {
    form.addEventListener('submit', function(e) {
        e.preventDefault();
        const buttonValue = form.querySelector('[type="hidden"]').value;
        const formData = new FormData(form);
        formData.append('action', 'create_post');

        fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
                method: 'POST',
                body: formData
            })
            .then(response => response.json())
            .then(data => {
                updatePageWithNewPost(data, buttonValue, data.id);
                posts.push(data);
                showNotification();
            });
    });
});
</script>
<?php
}
?>

刷新后PHP渲染逻辑

public function display_generated_pages()
{
    $generated_pages = get_option('wooster_generated_pages', array());
    $updated_pages = array();

    foreach ($generated_pages as $page) {
        $post = get_post($page['id']);
        if ($post) {
        if ($post && ($post->post_status == 'draft' || $post->post_status == 'publish')) {

            echo '<tr id="post-' . esc_attr($page['id']) . '" class="custom-table-row">';
            echo '<td>' . esc_html($page['title']) . '</td>';
            echo '<td>' . esc_html($page['title']) . '</td>';
            echo '<td>' . esc_html($page['date']) . '</td>';
            $constructor = '';
            if (isset($_POST['submit-gutenberg']) && $_POST['submit-gutenberg'] === 'Gutenberg') {
                $constructor = 'Gutenberg';
            } elseif (isset($_POST['submit-elementor']) && $_POST['submit-elementor'] === 'Elementor') {
                $constructor = 'Elementor';
            }
            echo '<td>' . esc_html($constructor) . '</td>';
            echo '<td class="actions">';
            echo '<button class="viewBtn" data-preview-url="' . esc_url($page['previewUrl']) . '"><i class="fas fa-eye fa-lg"></i></button>';
            echo '<button class="editBtn"><i class="fas fa-edit fa-lg"></i></button>';
            echo '<button class="deleteBtn" data-post-id="' . esc_attr($page['id']) . '"><i class="fas fa-trash-alt fa-lg"></i></button>';
            echo '</td>';
            echo '</tr>';

            // 将现有页面添加到更新后的列表
            $updated_pages[] = $page;
        } elseif ($post->post_status != 'trash') {
            $updated_pages[] = $page;
        }
        }
    }

    // 更新选项,保存现有页面列表
    update_option('wooster_generated_pages', $updated_pages);
}

问题根源

  1. HTML结构不一致:JS生成的行顺序是「标题→日期→构建器→操作」,但PHP渲染时是「标题→标题→日期→构建器」,列顺序完全混乱,导致依赖结构的CSS样式无法匹配。
  2. 构建器字段获取失效:刷新页面后$_POST数据已清空,PHP里的$constructor永远为空,不仅内容错误,还可能影响依赖该列的样式逻辑。
  3. 数据存储缺失:生成页面时未将构建器类型存入$generated_pages,导致刷新后无法获取该信息。

修复方案

1. 修正数据存储逻辑

在创建文章的AJAX回调中,把构建器类型存入wooster_generated_pages选项:

function create_post_callback() {
    // 省略创建文章的核心逻辑
    $post_id = wp_insert_post($post_data);
    
    $generated_pages = get_option('wooster_generated_pages', array());
    $generated_pages[] = array(
        'id' => $post_id,
        'title' => get_the_title($post_id),
        'date' => get_the_date('', $post_id),
        'previewUrl' => get_preview_post_link($post_id),
        'constructor' => $_POST['submit-gutenberg'] ?? $_POST['submit-elementor'] ?? '' // 保存构建器类型
    );
    update_option('wooster_generated_pages', $generated_pages);
    
    wp_send_json_success(array(
        'id' => $post_id,
        'title' => get_the_title($post_id),
        'date' => get_the_date('', $post_id),
        'previewUrl' => get_preview_post_link($post_id)
    ));
}
add_action('wp_ajax_create_post', 'create_post_callback');

2. 修正PHP渲染的HTML结构

调整列顺序,和JS生成的保持一致,同时直接从存储的数组中读取构建器类型:

public function display_generated_pages()
{
    $generated_pages = get_option('wooster_generated_pages', array());
    $updated_pages = array();

    foreach ($generated_pages as $page) {
        $post = get_post($page['id']);
        if ($post && ($post->post_status == 'draft' || $post->post_status == 'publish')) {
            // 匹配JS生成的列顺序:标题→日期→构建器→操作
            echo '<tr id="post-' . esc_attr($page['id']) . '" class="custom-table-row">';
            echo '<td>' . esc_html($page['title']) . '</td>';
            echo '<td>' . esc_html($page['date']) . '</td>'; // 替换重复的title为日期
            echo '<td>' . esc_html($page['constructor']) . '</td>'; // 直接读取存储的构建器类型
            echo '<td class="actions">';
            echo '<button class="viewBtn" data-preview-url="' . esc_url($page['previewUrl']) . '"><i class="fas fa-eye fa-lg"></i></button>';
            // 直接生成编辑链接,避免依赖JS事件绑定
            echo '<button class="editBtn" onclick="window.location.href=\'' . admin_url('post.php?action=edit&post=' . $page['id']) . '\'"><i class="fas fa-edit fa-lg"></i></button>';
            echo '<button class="deleteBtn" data-post-id="' . esc_attr($page['id']) . '"><i class="fas fa-trash-alt fa-lg"></i></button>';
            echo '</td>';
            echo '</tr>';

            $updated_pages[] = $page;
        } elseif ($post && $post->post_status != 'trash') {
            $updated_pages[] = $page;
        }
    }

    update_option('wooster_generated_pages', $updated_pages);
}

3. 验证CSS样式选择器

确保CSS样式是直接针对.custom-table-row及其子元素,不依赖动态添加的特殊状态:

.custom-table {
    width: 100%;
    border-collapse: collapse;
}
.custom-table-row {
    border-bottom: 1px solid #eee;
}
.custom-table-row td {
    padding: 12px;
}
.actions button {
    margin: 0 4px;
    padding: 6px 10px;
    border: none;
    border-radius: 4px;
    cursor: pointer;
}

内容的提问来源于stack exchange,提问作者OceaneEMILE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:54:52