短代码(Shortcode)是 WordPress 中一个经典而强大的功能,允许用户在文章内容中用简短的标签调用复杂的动态内容。从简单的 [gallery] 到复杂的 [contact-form-7],短代码为内容编辑器提供了无限的扩展能力。高级短代码的开发涉及参数处理、嵌套、缓存和动态数据获取等多个方面。

短代码的注册使用 add_shortcode 函数,通常在 init 钩子中或直接在主文件里注册:

add_shortcode('my_button', 'render_button_shortcode');
function render_button_shortcode($atts, $content = null) {
    $atts = shortcode_atts(array(
        'url' => '#',
        'color' => 'blue',
        'size' => 'medium'
    ), $atts, 'my_button');
    
    return '<a href="' . esc_url($atts['url']) . '" class="btn btn-' . $atts['color'] . ' btn-' . $atts['size'] . '">' . $content . '</a>';
}

用户在编辑器中输入 [my_button url="https://example.com" color="red"]点击这里[/my_button],就会输出一个带样式的按钮。shortcode_atts 函数负责合并默认属性和用户提供的属性,确保所有参数都有值。

短代码支持嵌套,即在一个短代码中调用另一个短代码。要让嵌套正常工作,需要在渲染函数中调用 do_shortcode 处理内容中的嵌套短代码:

add_shortcode('wrapper', 'render_wrapper_shortcode');
function render_wrapper_shortcode($atts, $content = null) {
    return '<div class="wrapper">' . do_shortcode($content) . '</div>';
}

这样 [wrapper][my_button]点击[/my_button][/wrapper] 就能正常解析。

带动态数据的短代码非常实用。比如创建一个显示最新文章列表的短代码:

add_shortcode('recent_posts', 'render_recent_posts_shortcode');
function render_recent_posts_shortcode($atts) {
    $atts = shortcode_atts(array(
        'number' => 5,
        'category' => ''
    ), $atts, 'recent_posts');
    
    $args = array(
        'posts_per_page' => intval($atts['number']),
        'post_status' => 'publish'
    );
    if (!empty($atts['category'])) {
        $args['category_name'] = $atts['category'];
    }
    
    $posts = get_posts($args);
    if (empty($posts)) {
        return '暂无文章';
    }
    
    $output = '<ul class="recent-posts">';
    foreach ($posts as $post) {
        $output .= '<li><a href="' . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a></li>';
    }
    $output .= '</ul>';
    return $output;
}

使用 [recent_posts number="10" category="news"] 即可输出指定分类的最新 10 篇文章。

短代码的性能是一个重要考量。如果短代码中执行了数据库查询,在多个页面上多次使用同一个短代码可能会导致重复查询。推荐使用对象缓存来缓存短代码的输出:

function render_cached_shortcode($atts, $content = null) {
    $cache_key = 'shortcode_' . md5(serialize($atts) . $content);
    $cached = wp_cache_get($cache_key, 'shortcodes');
    if ($cached !== false) {
        return $cached;
    }
    // 渲染短代码...
    $output = '...';
    wp_cache_set($cache_key, $output, 'shortcodes', 3600);
    return $output;
}

带缓存后,后续访问相同参数的短代码就不会重复查询数据库了。

短代码中也可以使用 AJAX 实现动态加载。比如,创建一个“加载更多”按钮短代码,点击后通过 REST API 获取更多内容。这种方式适合内容量很大的列表,避免一次性加载所有内容。

短代码的调试可以通过 do_shortcode 函数测试。在主题的任意 PHP 文件中调用 echo do_shortcode('[my_button]测试[/my_button]') 可以验证输出结果。对于复杂短代码,建议添加错误日志记录。

使用短代码时要注意安全性。用户输入的所有属性都应该经过转义处理,esc_urlesc_attresc_html 等函数要在输出时使用。对于需要执行 SQL 查询的短代码,必须使用 $wpdb->prepare 预处理参数。

短代码是内容和代码之间的桥梁。合理使用短代码可以让内容编辑人员在不接触 PHP 代码的情况下,轻松插入复杂的动态内容。而开发人员则可以通过短代码把功能模块化,在多个项目中复用。