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

WordPress表格行按需加载及单条展开折叠交互开发需求

Hey there! I’ve tackled exactly this scenario in a couple of WordPress projects before, so let’s walk through a solid implementation that hits all your requirements: lazy-loading details, single-row expansion, and optimized page load times.

Solution: WordPress Table Row Lazy-Load + Single Expansion

1. Table HTML Structure

First, set up your table with a base "compact" row for each entry, and a hidden detail row that’ll hold loaded content. We’ll use data attributes to tie rows together and pass unique IDs for fetching details.

<table class="compact-details-table">
  <thead>
    <tr>
      <th>Column 1</th>
      <th>Column 2</th>
      <th>Actions</th>
    </tr>
  </thead>
  <tbody>
    <!-- Row 1: Compact view -->
    <tr class="compact-row" data-row-id="1">
      <td>Item 1</td>
      <td>Basic info 1</td>
      <td><a href="#" class="view-detail-btn">View Detail</a></td>
    </tr>
    <!-- Hidden detail row for Row 1 -->
    <tr class="detail-row" data-row-id="1" style="display: none;">
      <td colspan="3">
        <div class="detail-content-container">
          <div class="loading-spinner">Loading...</div>
        </div>
      </td>
    </tr>

    <!-- Repeat for other rows -->
    <tr class="compact-row" data-row-id="2">
      <td>Item 2</td>
      <td>Basic info 2</td>
      <td><a href="#" class="view-detail-btn">View Detail</a></td>
    </tr>
    <tr class="detail-row" data-row-id="2" style="display: none;">
      <td colspan="3">
        <div class="detail-content-container">
          <div class="loading-spinner">Loading...</div>
        </div>
      </td>
    </tr>
  </tbody>
</table>

2. CSS Styling

Add basic styles to handle hiding/showing rows, spinners, and smooth transitions:

/* Base table styles */
.compact-details-table {
  width: 100%;
  border-collapse: collapse;
}
.compact-details-table th, .compact-details-table td {
  border: 1px solid #ddd;
  padding: 8px;
}

/* Detail row styling */
.detail-row {
  background-color: #f9f9f9;
  transition: all 0.3s ease;
}
.loading-spinner {
  color: #666;
  padding: 10px;
  text-align: center;
}
.view-detail-btn {
  color: #0073aa;
  text-decoration: none;
}
.view-detail-btn:hover {
  text-decoration: underline;
}

3. Frontend JavaScript (with AJAX)

This script handles click events, collapses open rows, and fetches details via AJAX only when needed. It also caches loaded content to avoid re-fetching.

document.addEventListener('DOMContentLoaded', function() {
  const detailButtons = document.querySelectorAll('.view-detail-btn');
  
  detailButtons.forEach(button => {
    button.addEventListener('click', function(e) {
      e.preventDefault();
      
      const rowId = this.closest('.compact-row').dataset.rowId;
      const targetDetailRow = document.querySelector(`.detail-row[data-row-id="${rowId}"]`);
      const contentContainer = targetDetailRow.querySelector('.detail-content-container');
      
      // Collapse all other detail rows first
      document.querySelectorAll('.detail-row').forEach(row => {
        if (row.dataset.rowId !== rowId) {
          row.style.display = 'none';
        }
      });
      
      // Check if content is already loaded
      if (!contentContainer.dataset.loaded) {
        contentContainer.querySelector('.loading-spinner').style.display = 'block';
        
        // Fetch content via WordPress AJAX
        fetch(window.tableDetailVars.ajaxurl, {
          method: 'POST',
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
          },
          body: new URLSearchParams({
            action: 'fetch_table_detail',
            row_id: rowId,
            security: window.tableDetailVars.nonce
          })
        })
        .then(response => response.text())
        .then(data => {
          contentContainer.innerHTML = data;
          contentContainer.dataset.loaded = 'true';
          targetDetailRow.style.display = 'table-row';
        })
        .catch(error => {
          contentContainer.innerHTML = '<p>Failed to load details. Please try again.</p>';
        });
      } else {
        // Toggle visibility if content is already loaded
        targetDetailRow.style.display = targetDetailRow.style.display === 'table-row' ? 'none' : 'table-row';
      }
    });
  });
});

4. WordPress Backend AJAX Handling

Add this to your theme’s functions.php file to register the AJAX action and return detail content. Customize the get_table_detail_content function to pull your actual data (e.g., from custom post types, meta fields).

// Register AJAX action for logged-in and guest users
add_action('wp_ajax_fetch_table_detail', 'fetch_table_detail');
add_action('wp_ajax_nopriv_fetch_table_detail', 'fetch_table_detail');

function fetch_table_detail() {
  // Verify security nonce
  check_ajax_referer('table_detail_nonce', 'security');
  
  $row_id = isset($_POST['row_id']) ? intval($_POST['row_id']) : 0;
  
  // Get your detail content here (customize this!)
  $detail_content = get_table_detail_content($row_id);
  
  echo $detail_content;
  wp_die(); // Required for WordPress AJAX handlers
}

// Example function to retrieve detail content
function get_table_detail_content($row_id) {
  // Replace this with your actual data fetch logic
  return '<div class="loaded-detail">
            <h3>Detailed Info for Item ' . $row_id . '</h3>
            <p>This content loads only when you click "View Detail"</p>
            <ul>
              <li>Additional attribute 1</li>
              <li>Additional attribute 2</li>
              <li>Additional attribute 3</li>
            </ul>
          </div>';
}

// Enqueue scripts and pass AJAX variables
add_action('wp_enqueue_scripts', 'enqueue_table_detail_scripts');
function enqueue_table_detail_scripts() {
  wp_enqueue_script(
    'table-detail-script',
    get_template_directory_uri() . '/js/table-detail.js',
    array('jquery'),
    '1.0',
    true
  );
  
  // Pass AJAX URL and nonce to frontend
  wp_localize_script('table-detail-script', 'tableDetailVars', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
    'nonce' => wp_create_nonce('table_detail_nonce')
  ));
}

Key Features Breakdown

  • Lazy Loading: Details are fetched only on user click, so initial page load stays fast.
  • Single Row Expansion: The script collapses all other open rows before showing the current one.
  • Content Caching: Once loaded, content is stored locally to avoid redundant AJAX calls.
  • Security: Uses WordPress nonces to block unauthorized requests.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:12:46