WordPress开发笔记

WordPress获取系统默认参数化访问链接方法

在WordPress中,即使你配置了固定链接,系统默认的参数化链接仍然有效。以下是获取各类内容默认参数访问链接的方法:

不含分页的解决方法

多次检测修正后的函数

/**
 * 获取系统默认参数化访问链接
 * 
 * @param int|null $id 内容ID (文章/分类/标签等)
 * @param string $type 内容类型 ('post', 'term')
 * @param string $taxonomy 分类法名称 (当$type='term'时必填)
 * @return string 默认参数化URL
 */
function zzw_get_default_param_link($id = null, $type = 'post', $taxonomy = '') {
    $url = home_url('/');

    // 自动获取当前对象ID
    if (null === $id) {
        if (is_singular()) {
            $id = get_the_ID();
        } elseif (is_tax() || is_category() || is_tag()) {
            $id = get_queried_object_id();
        }
    }

    if (!$id) return $url;

    switch ($type) {
        case 'post':
            $post = get_post($id);
            if (!$post) return $url;

            if ('page' === $post->post_type) {
                return add_query_arg('page_id', $id, $url);
            } 
            // 处理自定义文章类型
            elseif ('post' !== $post->post_type) {
                return add_query_arg([
                    'post_type' => $post->post_type,
                    'p' => $id
                ], $url);
            } 
            // 默认文章类型
            else {
                return add_query_arg('p', $id, $url);
            }

        case 'term':
            $term = get_term($id, $taxonomy);
            if (!$term || is_wp_error($term)) return $url;

            // 分类目录
            if ('category' === $taxonomy) {
                return add_query_arg('cat', $id, $url);
            } 
            // 文章标签
            elseif ('post_tag' === $taxonomy) {
                return add_query_arg('tag', $term->slug, $url);
            } 
            // 自定义分类法 - 修正后的正确结构
            else {
                return add_query_arg($taxonomy, $term->slug, $url);
            }

        default:
            return $url;
    }
}

各类内容正确结构说明:

内容类型正确默认参数化结构示例
普通文章?p=123/?p=42
页面?page_id=456/?page_id=15
自定义文章类型?post_type=cpt&p=789/?post_type=product&p=78
分类目录?cat=12/?cat=5
文章标签?tag=slug/?tag=technology
自定义分类法?taxonomy=slug/?genre=sci-fi

使用示例:

// 1. 自定义分类法项 (如 'genre' 分类法)
$term_link = zzw_get_default_param_link(
    $term_id, 
    'term', 
    'genre' // 分类法名称
); 
// 输出: /?genre=sci-fi

// 2. 自定义文章类型单篇 (如 'movie')
$cpt_link = zzw_get_default_param_link($post_id); 
// 输出: /?post_type=movie&p=123

// 3. 分类目录
$cat_link = zzw_get_default_param_link(5, 'term', 'category'); 
// 输出: /?cat=5

// 4. 文章标签
$tag_link = zzw_get_default_param_link($tag_id, 'term', 'post_tag'); 
// 输出: /?tag=technology

在模板中的使用示例:

// 在分类法归档页获取当前项的默认链接
if (is_tax()) {
    $term = get_queried_object();
    $default_link = zzw_get_default_param_link(
        $term->term_id, 
        'term', 
        $term->taxonomy
    );
    echo '<a href="'.esc_url($default_link).'">Default URL</a>';
}

// 在单篇文章中获取默认链接
if (is_single()) {
    $default_link = zzw_get_default_param_link();
    echo '<a href="'.esc_url($default_link).'">Default URL</a>';
}

注意事项:

  1. 分类法名称必须与注册时完全一致
  2. 标签使用 slug 而非 ID
  3. 分类目录使用 ID 而非 slug
  4. 确保保留您的重定向禁用代码:
   add_filter('redirect_canonical', function($redirect) {
       return false;
   });

这个版本完全遵循 WordPress 的核心查询参数规范,特别是正确处理了自定义分类法的默认链接结构。

含分页且将文章和分类分别独立函数

将原函数拆分为两个专用函数:一个用于文章/页面/自定义文章类型,另一个用于分类/标签/自定义分类法。同时,我会添加分页支持并创建直观的界面来展示这些功能。

优化后的函数实现

/**
 * 获取文章/页面的默认参数化访问链接(含分页支持)
 * 
 * @param int|null $id 文章/页面ID
 * @param int $page 分页页码 (文章分页使用)
 * @return string 默认参数化URL
 */
function zzw_get_default_post_param_link($id = null, $page = 1) {
    $url = home_url('/');

    // 自动获取当前对象ID
    if (null === $id && is_singular()) {
        $id = get_the_ID();
    }

    if (!$id) return $url;

    $post = get_post($id);
    if (!$post) return $url;

    // 处理页面
    if ('page' === $post->post_type) {
        $url = add_query_arg('page_id', $id, $url);
        // 页面分页
        if ($page > 1) {
            $url = add_query_arg('page', $page, $url);
        }
        return $url;
    } 

    // 处理自定义文章类型
    if ('post' !== $post->post_type) {
        $url = add_query_arg([
            'post_type' => $post->post_type,
            'p' => $id
        ], $url);
        // 自定义文章类型分页
        if ($page > 1) {
            $url = add_query_arg('page', $page, $url);
        }
        return $url;
    } 

    // 默认文章类型
    $url = add_query_arg('p', $id, $url);
    // 文章分页
    if ($page > 1) {
        $url = add_query_arg('page', $page, $url);
    }

    return $url;
}

/**
 * 获取分类/标签/自定义分类法的默认参数化访问链接(含分页支持)
 * 
 * @param int|null $id 分类/标签ID
 * @param string $taxonomy 分类法名称
 * @param int $page 分页页码 (归档分页使用)
 * @return string 默认参数化URL
 */
function zzw_get_default_term_param_link($id = null, $taxonomy = '', $page = 1) {
    $url = home_url('/');

    // 自动获取当前对象ID
    if (null === $id && (is_tax() || is_category() || is_tag())) {
        $id = get_queried_object_id();
    }

    if (!$id || !$taxonomy) return $url;

    $term = get_term($id, $taxonomy);
    if (!$term || is_wp_error($term)) return $url;

    // 分类目录
    if ('category' === $taxonomy) {
        $url = add_query_arg('cat', $id, $url);
    } 
    // 文章标签
    elseif ('post_tag' === $taxonomy) {
        $url = add_query_arg('tag', $term->slug, $url);
    } 
    // 自定义分类法
    else {
        $url = add_query_arg($taxonomy, $term->slug, $url);
    }

    // 归档分页
    if ($page > 1) {
        $url = add_query_arg('paged', $page, $url);
    }

    return $url;
}

// 禁用规范重定向以支持两种URL格式
add_filter('redirect_canonical', function($redirect) {
    return false;
});

使用示例

// 1. 普通文章(带分页)
$post_link = zzw_get_default_post_param_link(42, 2); 
// 输出: /?p=42&page=2

// 2. 页面(带分页)
$page_link = zzw_get_default_post_param_link(15, 3); 
// 输出: /?page_id=15&page=3

// 3. 自定义文章类型(如 'product')
$cpt_link = zzw_get_default_post_param_link(78); 
// 输出: /?post_type=product&p=78

// 4. 分类目录(带分页)
$cat_link = zzw_get_default_term_param_link(5, 'category', 2); 
// 输出: /?cat=5&paged=2

// 5. 文章标签
$tag_link = zzw_get_default_term_param_link(9, 'post_tag'); 
// 输出: /?tag=technology

// 6. 自定义分类法(如 'genre')
$custom_tax_link = zzw_get_default_term_param_link(12, 'genre', 3); 
// 输出: /?genre=sci-fi&paged=3

功能对比界面

下面是展示两个函数功能对比的HTML界面:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WordPress 默认参数链接生成器</title>
    <style>
        :root {
            --primary: #21759b;
            --primary-light: #d9edf7;
            --secondary: #464646;
            --light: #f5f5f5;
            --border: #ddd;
            --success: #4caf50;
            --post-color: #4a86e8;
            --term-color: #6aa84f;
        }

        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }

        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
            line-height: 1.6;
            color: var(--secondary);
            background-color: #f1f1f1;
            padding: 20px;
        }

        .container {
            max-width: 1200px;
            margin: 0 auto;
        }

        header {
            background: var(--primary);
            color: white;
            padding: 25px 30px;
            border-radius: 8px 8px 0 0;
            margin-bottom: 20px;
        }

        h1 {
            font-size: 28px;
            margin-bottom: 5px;
        }

        .subtitle {
            opacity: 0.9;
            font-size: 16px;
        }

        .content {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 20px;
            margin-bottom: 30px;
        }

        @media (max-width: 768px) {
            .content {
                grid-template-columns: 1fr;
            }
        }

        .card {
            background: white;
            border: 1px solid var(--border);
            border-radius: 8px;
            padding: 25px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.05);
            height: 100%;
        }

        .post-card {
            border-top: 4px solid var(--post-color);
        }

        .term-card {
            border-top: 4px solid var(--term-color);
        }

        h2 {
            font-size: 22px;
            margin-bottom: 20px;
            padding-bottom: 15px;
            border-bottom: 1px solid var(--border);
        }

        .post-card h2 {
            color: var(--post-color);
        }

        .term-card h2 {
            color: var(--term-color);
        }

        .function-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 15px;
        }

        .function-name {
            font-family: monospace;
            font-size: 18px;
            background: var(--light);
            padding: 8px 12px;
            border-radius: 4px;
        }

        .params {
            margin-bottom: 25px;
        }

        .param {
            display: flex;
            margin-bottom: 12px;
            padding-bottom: 12px;
            border-bottom: 1px dashed var(--border);
        }

        .param-name {
            width: 120px;
            font-weight: 500;
        }

        .param-desc {
            flex: 1;
        }

        .examples {
            background: var(--light);
            border-radius: 6px;
            padding: 20px;
            margin-top: 25px;
        }

        h3 {
            font-size: 18px;
            margin-bottom: 15px;
            color: var(--secondary);
        }

        .example {
            margin-bottom: 15px;
            padding: 15px;
            background: white;
            border-radius: 6px;
            border-left: 3px solid var(--primary);
        }

        .example-header {
            display: flex;
            justify-content: space-between;
            margin-bottom: 10px;
        }

        .example-title {
            font-weight: 500;
        }

        .example-output {
            font-family: monospace;
            background: #f8f9fa;
            padding: 12px;
            border-radius: 4px;
            border: 1px solid #eaecef;
            word-break: break-all;
        }

        .usage {
            margin-top: 30px;
            background: var(--primary-light);
            border-left: 4px solid var(--primary);
            padding: 20px;
            border-radius: 0 6px 6px 0;
        }

        .usage h3 {
            color: var(--primary);
        }

        .code-block {
            background: #2d2d2d;
            color: #f8f8f2;
            padding: 20px;
            border-radius: 6px;
            overflow-x: auto;
            margin: 15px 0;
            font-family: monospace;
            font-size: 15px;
        }

        .footer {
            text-align: center;
            margin-top: 40px;
            color: #777;
            font-size: 14px;
        }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <h1>WordPress 默认参数链接生成器</h1>
            <p class="subtitle">优化版函数 - 支持文章/页面和分类/标签分离处理</p>
        </header>

        <div class="content">
            <div class="card post-card">
                <h2>文章/页面链接生成</h2>

                <div class="function-header">
                    <div class="function-name">zzw_get_default_post_param_link()</div>
                </div>

                <div class="params">
                    <h3>参数说明</h3>
                    <div class="param">
                        <div class="param-name">$id</div>
                        <div class="param-desc">文章/页面ID (可选,默认为当前文章)</div>
                    </div>
                    <div class="param">
                        <div class="param-name">$page</div>
                        <div class="param-desc">分页页码 (文章内分页使用)</div>
                    </div>
                </div>

                <div class="examples">
                    <h3>使用示例</h3>

                    <div class="example">
                        <div class="example-header">
                            <div class="example-title">普通文章</div>
                        </div>
                        <div class="example-code">
                            <div class="code">zzw_get_default_post_param_link(42);</div>
                            <div class="example-output">/?p=42</div>
                        </div>
                    </div>

                    <div class="example">
                        <div class="example-header">
                            <div class="example-title">带分页的文章</div>
                        </div>
                        <div class="example-code">
                            <div class="code">zzw_get_default_post_param_link(42, 3);</div>
                            <div class="example-output">/?p=42&amp;page=3</div>
                        </div>
                    </div>

                    <div class="example">
                        <div class="example-header">
                            <div class="example-title">页面</div>
                        </div>
                        <div class="example-code">
                            <div class="code">zzw_get_default_post_param_link(15);</div>
                            <div class="example-output">/?page_id=15</div>
                        </div>
                    </div>

                    <div class="example">
                        <div class="example-header">
                            <div class="example-title">自定义文章类型</div>
                        </div>
                        <div class="example-code">
                            <div class="code">zzw_get_default_post_param_link(78);</div>
                            <div class="example-output">/?post_type=product&amp;p=78</div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="card term-card">
                <h2>分类/标签链接生成</h2>

                <div class="function-header">
                    <div class="function-name">zzw_get_default_term_param_link()</div>
                </div>

                <div class="params">
                    <h3>参数说明</h3>
                    <div class="param">
                        <div class="param-name">$id</div>
                        <div class="param-desc">分类/标签ID (可选,默认为当前分类)</div>
                    </div>
                    <div class="param">
                        <div class="param-name">$taxonomy</div>
                        <div class="param-desc">分类法名称 (必填)</div>
                    </div>
                    <div class="param">
                        <div class="param-name">$page</div>
                        <div class="param-desc">分页页码 (归档分页使用)</div>
                    </div>
                </div>

                <div class="examples">
                    <h3>使用示例</h3>

                    <div class="example">
                        <div class="example-header">
                            <div class="example-title">分类目录</div>
                        </div>
                        <div class="example-code">
                            <div class="code">zzw_get_default_term_param_link(5, 'category');</div>
                            <div class="example-output">/?cat=5</div>
                        </div>
                    </div>

                    <div class="example">
                        <div class="example-header">
                            <div class="example-title">带分页的分类</div>
                        </div>
                        <div class="example-code">
                            <div class="code">zzw_get_default_term_param_link(5, 'category', 2);</div>
                            <div class="example-output">/?cat=5&amp;paged=2</div>
                        </div>
                    </div>

                    <div class="example">
                        <div class="example-header">
                            <div class="example-title">文章标签</div>
                        </div>
                        <div class="example-code">
                            <div class="code">zzw_get_default_term_param_link(9, 'post_tag');</div>
                            <div class="example-output">/?tag=technology</div>
                        </div>
                    </div>

                    <div class="example">
                        <div class="example-header">
                            <div class="example-title">自定义分类法</div>
                        </div>
                        <div class="example-code">
                            <div class="code">zzw_get_default_term_param_link(12, 'genre', 3);</div>
                            <div class="example-output">/?genre=sci-fi&amp;paged=3</div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="usage">
            <h3>使用说明 & 注意事项</h3>
            <p>1. 这两个函数需要添加到主题的 <code>functions.php</code> 文件中</p>
            <p>2. 确保禁用规范重定向,以支持两种URL格式共存:</p>

            <div class="code-block">
add_filter('redirect_canonical', function($redirect) {
    return false;
});
            </div>

            <p>3. 分页参数说明:</p>
            <ul>
                <li><strong>文章分页</strong>:使用 <code>page</code> 参数 (如 <code>?p=42&amp;page=2</code>)</li>
                <li><strong>归档分页</strong>:使用 <code>paged</code> 参数 (如 <code>?cat=5&amp;paged=2</code>)</li>
            </ul>

            <p>4. 在模板中使用示例:</p>

            <div class="code-block">
// 获取当前文章默认链接
$post_link = zzw_get_default_post_param_link();

// 获取当前分类默认链接(带分页)
$term_link = zzw_get_default_term_param_link(
    get_queried_object_id(), 
    get_queried_object()->taxonomy,
    (get_query_var('paged') ?: 1)
);

// 输出备用链接
echo '&lt;a href="' . esc_url($post_link) . '"&gt;Default Post URL&lt;/a&gt;';
echo '&lt;a href="' . esc_url($term_link) . '"&gt;Default Term URL&lt;/a&gt;';
            </div>
        </div>

        <div class="footer">
            <p>WordPress 默认参数链接生成器 &copy; 2023 | 优化版函数支持所有内容类型和分页场景</p>
        </div>
    </div>
</body>
</html>

函数设计亮点

  1. 清晰的职责分离
  • zzw_get_default_post_param_link() 专门处理文章/页面/自定义文章类型
  • zzw_get_default_term_param_link() 专门处理分类/标签/自定义分类法
  1. 完善的分页支持
  • 文章分页使用 page 参数
  • 归档分页使用 paged 参数
  • 自动处理页码逻辑(第一页不添加参数)
  1. 智能ID获取
  • 当不提供ID时,自动获取当前上下文对象的ID
  • 支持手动指定ID的精确控制
  1. 错误处理
  • 验证文章/分类是否存在
  • 无效输入返回首页URL
  1. 上下文感知
  • 在文章页自动获取当前文章ID
  • 在分类页自动获取当前分类ID

使用场景对比

场景使用函数示例调用
普通文章zzw_get_default_post_param_link()zzw_get_default_post_param_link(42)
分页文章zzw_get_default_post_param_link()zzw_get_default_post_param_link(42, 3)
页面zzw_get_default_post_param_link()zzw_get_default_post_param_link(15)
自定义文章zzw_get_default_post_param_link()zzw_get_default_post_param_link(78)
分类目录zzw_get_default_term_param_link()zzw_get_default_term_param_link(5, 'category')
分页分类zzw_get_default_term_param_link()zzw_get_default_term_param_link(5, 'category', 2)
文章标签zzw_get_default_term_param_link()zzw_get_default_term_param_link(9, 'post_tag')
自定义分类zzw_get_default_term_param_link()zzw_get_default_term_param_link(12, 'genre')

这个优化方案提供了更清晰、更专注的函数设计,同时添加了分页支持,使您的WordPress网站能够完美处理所有类型的默认参数链接需求。