页面刷新后自定义表格样式失效问题求助
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); }
问题根源
- HTML结构不一致:JS生成的行顺序是「标题→日期→构建器→操作」,但PHP渲染时是「标题→标题→日期→构建器」,列顺序完全混乱,导致依赖结构的CSS样式无法匹配。
- 构建器字段获取失效:刷新页面后
$_POST数据已清空,PHP里的$constructor永远为空,不仅内容错误,还可能影响依赖该列的样式逻辑。 - 数据存储缺失:生成页面时未将构建器类型存入
$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
相关产品推荐
相关产品推荐

