【问题标题】:How to retrieve Tag_IDs for a post in WordPress?如何在 WordPress 中检索帖子的 Tag_ID?
【发布时间】:2021-03-22 14:58:59
【问题描述】:

我需要显示帖子的标签 ID。我试过了

$myTopics_id = '';
$tags = get_the_tags();
        
foreach($tags as $tag) {
    $myTopics_id .= $tag->tag_ID;
}

在循环内部获取要在此处显示的标签:

<div onclick="location.href='<?php the_permalink(); ?>'" data-topics="<?php echo $myTopics_id; ?>">

但它不显示任何内容,字符串只是保持为空:

<div onclick="http://localhost/posts/" data-topics="">

我在这里做错了什么?

编辑:感谢用户 biesior,我现在已将代码更改为:

<?php $wpb_all_query = new WP_Query(array('post_type'=>'post', 'post_status'=>'publish', 'posts_per_page'=>-1)); ?>

    <?php if ( $wpb_all_query->have_posts() ) : ?>

        <?php while ( $wpb_all_query->have_posts() ) : $wpb_all_query->the_post(); 
        
            /* Get Category ID */
            $categories = get_the_category();
            $mySection_id = $categories[0]->cat_ID;

            /* ------- */

            /* Get Tag IDs */
            $myTopics_id = '';
            $tags = get_tags();
            
            foreach($tags as $tag) {
                $myTopics_id .= $tag->term_id;
                $myTopics_id .= ", ";
            }

        ?>

            <div data-topics="<?php echo $myTopics_id; ?>" data-section="<?php echo $mySection_id; ?>">   
                ... content to be displayed ... 
            </div>
        <?php endwhile; ?>

    <?php wp_reset_postdata(); ?>

<?php endif; ?>

但结果仍然是错误的,因为它是将 term_ids 相加,而不是在每个帖子中单独显示。

所以,作为一个例子,我目前的结果是

<div data-topics="15, 16, 13, 12, 10, 8, 11, " data-section="3"> ... </div>

如您所见,每个帖子的当前类别显示正确。但是数据主题的价值是错误的,并且在每篇文章中都是一样的。 每个帖子可能有多个标签。因此,如果结果是这样,那将是正确的

<div data-topics="15, 16, " data-section="3"> ... </div>

第一篇文章,然后

<div data-topics="13, " data-section="7"> ... </div>

第二次

<div data-topics="12, 10, 8, " data-section="1"> ... </div>

第三个帖子,以此类推。

但目前每个帖子的数据主题值都相同(“15、16、13、12、10、8、11、”),因此循环或标签请求中似乎存在错误。但我不知道什么和在哪里。

【问题讨论】:

  • 放在foreach() 循环中的var_dump($tag) 显示了什么?
  • 具体在哪里?在 $myTopics_id .= $tag->tag_ID; 行之前还是在里面还是……?抱歉,我是 WP 主题和 PHP 的新手 :-(
  • 你可以把它放在forech()循环的开头。线索是确保$tag 被完全提取并且是所需类型的对象。您还可以通过在 PHP 代码的第 3 行添加 var_dump($tags) 来检查是否正确获取了 $tags。将来值得启用即 Xdebug 并配置您的 IDE 以使用它来更轻松地调试此类事情,而不是将var_dump() 到处乱放。
  • 好的,谢谢。它渲染了很多东西,例如 object(WP_Term)#1084 (10) { ["term_id"]=> int(15) ["name"]=> string(13) "Sample 1" ["slug"] => string(13) "Sample 2" ["term_group"]=> int(0) ["term_taxonomy_id"]=> int(15)
  • 你可以看到这个对象没有名为tag_ID的字段,你的意思是term_id吗?或者也许你正在获取错误的对象?这几行很难猜。

标签: php tags wordpress-theming


【解决方案1】:

首先,您不需要启动一个完成 PHP 块,只需执行一次即可。第二件事 - 您需要调试 get_tags() 返回的内容。一般来说,这段代码应该工作,无论如何没有实例和/或样本数据就不可能检查它。此外,还有更好的方法来创建逗号分隔的值列表,而不仅仅是粘合(即避免尾随逗号)

<?php

$wpb_all_query = new WP_Query(array ('post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => -1));
if ($wpb_all_query->have_posts()) :

    while ($wpb_all_query->have_posts()) : $wpb_all_query->the_post();

        /* Get Category ID */
        $categories = get_the_category();
        $mySection_id = $categories[0]->cat_ID;

        /* Get Tag IDs */

        $tags = get_tags();
        var_dump($tags); // debug it to check what tags are returned in each `while` loop
        $tagsArray = [];


        foreach ($tags as $tag) {
            $tagsArray[] = $tag->term_id;
        }
        $myTopics_id = implode(',', $tagsArray);

        echo "<div data-topics='{$myTopics_id}' data-section='{$mySection_id}'>
            ... content to be displayed ...
        </div>";


    endwhile;

    wp_reset_postdata();
endif;

【讨论】:

  • 我完全理解在没有真实样本数据的情况下很难(不可能?找到解决方案。不幸的是,我正在开发的网站仍在进行中,并且只能在我的本地机器上使用。削减长话短说:不同的代码,相同的结果。:-(((
  • PS: var_dump($tags);每篇文章的结果都完全相同
  • 表示获取所有标签,需要查看get_tags() body
  • 我需要类似 the_tags();只是不回显,而是作为返回值。什么是正确的等价物? the_tags();显示正确的值(就像名称而不是 ID,但好吧......至少每个帖子只有标签名称,而不是一次全部)。
  • @JonSnow 我不知道,我什至不知道它来自什么,因为您没有指定代码的来源。如果是您自己的方法,请将它们发布到某个公共存储库,以便可以将其链接到所需的文件和行,如果您购买了它,请联系开发人员。否则,如果您使用了一些开源软件,请随意分叉并根据您的需要进行调整。在不知道我们正在谈论的代码的情况下,我的回答只是关于一般编程的建议或意见。这就像通过钥匙孔了解世界。
【解决方案2】:

我会在这里发布我的解决方案,以防有人遇到同样的问题:

$myTopics = get_the_tags();
$myTopics_id = "";
$myTopics_array = [];

if ($myTopics) {
    foreach($myTopics as $tag) {
         $myTopics_array[] = $tag->term_id;
    }
}

$myTopics_id = implode(',', $myTopics_array);


echo "<div data-topics='{$myTopics_id}'>";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多