Make post title active

时间:2015-06-03 作者:BritishSam

嗨,我有一个简单的网站,显示列表中的每个帖子标题,我正在尝试更改活动帖子标题,使其在查看时有所不同。我试过这个,但不起作用。

<ul class="students">
 <?php

 $IDOutsideLoop = $post->ID;
 global $post;

 $myposts = wp_get_archives(\'type=alpha\');
 foreach($myposts as $post) :
 ?>

      <li <?php if(is_single() && $IDOutsideLoop == $post->ID) print \'style="font-weight:bold";\' 
      ?>><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>

 <?php endforeach; ?>

</ul>

3 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您当前的代码依赖于上班的时间旅行:

$IDOutsideLoop = $post->ID;
global $post;
具体来说,第一条线是展望未来,它如何知道$post->ID 是否未申报?解决方法是global $post;, 但是当电脑到达那条线时,已经太晚了

global $post;
$IDOutsideLoop = $post->ID;
如果你想列出帖子,你应该考虑WP_Queryget_posts. 在您的情况下,使用它可能更快pre_get_posts

SO网友:s_ha_dum

这些行是多余的:

$IDOutsideLoop = $post->ID;
global $post;
你不需要它们。试一下var_dump($post->ID); 您将看到变量已经可用。

现在,从法典中:

此函数displays 基于日期的存档列表。此标记可以在模板中的任何位置使用。

默认情况下,wp_list_archives() 回显内容。你的$myposts 未设置变量。像这样修改代码。。。

$args = array(
  \'type\' => \'alpha\',
  \'echo\' => false,
);
$myposts = wp_get_archives($args);
。。。将修复该问题,但您得到的是字符串,而不是可以迭代的数组。和wp_get_archives() 默认情况下已生成HTML列表。

遗憾的是,可用于操作输出的过滤器非常有限。你需要去冒险regex 在标记上,模式将随permalink结构而改变,或者您可以基于url对帖子进行资源密集型搜索:

function alter_list_output_wpse_190357($link) {
  global $post;

  $pat = "|(<li[^>]*>).* href=\'([^\']*)\'(.*>)|";
  preg_match($pat,$link,$matches);
  $id = url_to_postid($matches[2]);
  if ($post->ID === $id) {
    $link = preg_replace($pat,"<li style=\\"font-weight:bold\\"><a href=\'$2\' $3",$link);
  }
  return $link;
}
add_filter( \'get_archives_link\', \'alter_list_output_wpse_190357\' );
您最好使用WP_Queryget_posts 正如TomJ Nowell在回答中已经提到的,但我想解释一下这个项目。

SO网友:BritishSam

我最后用了这个

<?php

global $post;
$IDOutsideLoop = $post->ID;
$args = array( \'posts_per_page\' => 999, \'orderby\'=> \'title\', \'order\' => \'ASC\' );

$myposts = get_posts( $args );
foreach($myposts as $post) :
?>

   <li <?php if(is_single() && $IDOutsideLoop == $post->ID) print \'class="viewing"\'; ?>>     
   <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>

<?php endforeach; ?>

</ul>

结束