我在下面创建了一个插件,以显示一个简单的帖子分级列表(在这种情况下是职位空缺)。
最近,它开始错误地显示层次结构中第一个项目的标题 - 获取其中一个子类别的标题。我无法理解为什么wordpress更新或类似的东西会导致这种情况发生?!
<?php
class FSSVacancyWidget extends WP_Widget
{
function FSSVacancyWidget()
{
$widget_ops = array('classname' => 'FSSVacancyWidget', 'description' => 'Displays Recent FSS Jobs on the homepage and all other pages' );
$this->WP_Widget('FSSVacancyWidget', 'FSS Vacancies', $widget_ops);
}
function form($instance)
{
$instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
$title = $instance['title'];
$fss_numposts = $instance['fss_numposts'];
$fss_vacurl = $instance['fss_vacurl'];
$fss_morevac = $instance['fss_morevac'];
?>
<p><label for="<?php echo $this->get_field_id('title'); ?>">Title: <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo attribute_escape($title); ?>" /></label></p>
<p><label for="<?php echo $this->get_field_id('fss_numposts'); ?>">Number of Posts (Default is 10): <input class="widefat" id="<?php echo $this->get_field_id('fss_numposts'); ?>" name="<?php echo $this->get_field_name('fss_numposts'); ?>" type="text" value="<?php echo attribute_escape($fss_numposts); ?>" /></label></p>
<p><label for="<?php echo $this->get_field_id('fss_vacurl'); ?>">Vacancy URL: <input class="widefat" id="<?php echo $this->get_field_id('fss_vacurl'); ?>" name="<?php echo $this->get_field_name('fss_vacurl'); ?>" type="text" value="<?php echo attribute_escape($fss_vacurl); ?>" /></label></p>
<p><label for="<?php echo $this->get_field_id('fss_morevac'); ?>">More Vacancies Title: <input class="widefat" id="<?php echo $this->get_field_id('fss_morevac'); ?>" name="<?php echo $this->get_field_name('fss_morevac'); ?>" type="text" value="<?php echo attribute_escape($fss_morevac); ?>" /></label></p>
<?php
}
function update($new_instance, $old_instance)
{
$instance = $old_instance;
$instance['title'] = $new_instance['title'];
$instance['fss_numposts'] = $new_instance['fss_numposts'];
$instance['fss_vacurl'] = $new_instance['fss_vacurl'];
$instance['fss_morevac'] = $new_instance['fss_morevac'];
return $instance;
}
function widget($args, $instance)
{
extract($args, EXTR_SKIP);
/* User-selected settings. */
$fss_numposts = $instance['fss_numposts'];
$fss_vacurl = $instance['fss_vacurl'];
$fss_morevac = $instance['fss_morevac'];
echo $before_widget;
$title = empty($instance['title']) ? ' ' : apply_filters('widget_title', $instance['title']);
if (!empty($title))
echo $before_title . $title . $after_title;;
// WIDGET CODE
echo "<ul class='items'>";
query_posts( array( 'showposts' => $fss_numposts ) );
if ( have_posts() ) : while ( have_posts() ) : the_post();
echo "<li><a href='".get_permalink()."'><span class='job-title'>".get_the_title()."</span><span class='job-date'>".get_the_date('d m Y')."</span></a></li>";
endwhile; endif; wp_reset_query();
echo "</ul>";
echo"<a href='".$fss_vacurl."' class='view'>".$fss_morevac."</a>";
echo $after_widget;
}
}
add_action( 'widgets_init', create_function('', 'return register_widget("FSSVacancyWidget");') );
?>
&#13;
答案 0 :(得分:1)
您的小部件已完全过时,无法尝试调试和修复。不幸的是,这是事实。
以下是重大问题
去年支持php 5.3,你仍然支持之前的版本,导致黑客可以轻易利用的安全漏洞
create_function()
,这是pre php 5.3。这是代码中严重的安全循环漏洞,非常危险。使用在php 5.3中引入并且仍然支持的正确闭包(function()
)
extract()
已完全从Wordpress核心中移除。 ( CAVEAT:我认为仍然有一个功能,核心开发人员仍然需要找到替代品,只是不记得哪一个)。 extract()
非常不一致,并且会破坏实例中的变量。你应该避免使用它。事实上,它已从核心中的所有功能中删除,它应该真的告诉你它有多糟糕
您绝不能使用query_posts
。它打破了主要查询和非常重要的功能,如get_queried_object()
和全局变量,如$post
,其上有很多插件和其他功能,如最近的帖子所依赖。它完全打破了分页,在大多数情况下完全失败,特别是无限滚动的情况。 query_posts
在重新运行查询时也会降低页面加载速度。您应该在小部件中使用WP_Query
使用构造函数方法(__construct
)而不是类名作为主构造函数。这是pre php5语法。正如我已经说过的,去年你的php 5.3被删除了,为什么你还在支持版本5之前的版本。我不能强调这一点,对这些旧版本的支持会导致安全漏洞
我可以给你解决问题的最佳建议是查看Widget API和WP_Query
,然后根据这些指南重写(实际上写一个完整的新小部件)你的widgt