搜索
Hi~登录注册
查看: 1576|回复: 0

WordPress 自定义文章列表列的实例

[复制链接]

1892

主题

1899

帖子

6406

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6406
发表于 2015-5-14 13:49:37 | 显示全部楼层 |阅读模式
下面来看一篇关于WordPress 自定义文章列表列的实例,这个功能在wp系统默认是没有的我们是看一站长开发了,下面整理和各位分享。
</div><div>
<p>今天要实现的效果如下图,具体的功能就是在列表里添加一列&ldquo;推荐指数&rdquo;,用来显示每篇文章的推荐指数,同时可以根据&ldquo;推荐指数&rdquo;来进行文章排序。</p>
<p><img class="" width="626" height="337" alt="" src="/get_pic/upload/image/20150109174059.jpg" /></p>
</div>
<div>
<p>首先要做的就是在表头添加&ldquo;推荐指数&rdquo;列。</p>
<table style="background: #fb7" border="0" cellspacing="1" cellpadding="1" width="620" align="center">
    <tbody>
        <tr>
            <td bgcolor="#ffe7ce" height="27" width="464">&nbsp;代码如下</td>
            <td style="cursor: pointer" bgcolor="#ffe7ce" width="109" align="center" onClick="doCopy('copy3282')">复制代码</td>
        </tr>
        <tr>
            <td style="padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px" id="copy3282" class="copyclass" bgcolor="#ffffff" valign="top" colspan="2">
            <p>function add_rating_column($columns) {<br />
            &nbsp;&nbsp;&nbsp; $columns['rating'] = '推荐指数';<br />
            &nbsp;&nbsp;&nbsp; return $columns;<br />
            }<br />
            add_filter('manage_posts_columns' , 'add_rating_column');</p>
            </td>
        </tr>
    </tbody>
</table>
<p><br />
&nbsp;manage_posts_columns Filter可以应用管理文章页面的表头里,用来修改表头信息。注意该Filter不会应用到Page的列表页面,如需用到,请使用manage_pages_columns 或者 manage_${post_type}_posts_columns</p>
<p>有了表头,只是添加了这一列,但是该列还没有内容,我们来为该列填充数据。</p>
<table style="background: #fb7" border="0" cellspacing="1" cellpadding="1" width="620" align="center">
    <tbody>
        <tr>
            <td bgcolor="#ffe7ce" height="27" width="464">&nbsp;代码如下</td>
            <td style="cursor: pointer" bgcolor="#ffe7ce" width="109" align="center" onClick="doCopy('copy1374')">复制代码</td>
        </tr>
        <tr>
            <td style="padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px" id="copy1374" class="copyclass" bgcolor="#ffffff" valign="top" colspan="2">
            <p>function rating_column_content($column_name, $post_id) {<br />
            &nbsp;&nbsp;&nbsp; if ($column_name == 'rating') {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rating_value = get_post_meta( $post_id, '_rating', true );<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo ($rating_value / 2) . '星';<br />
            &nbsp;&nbsp;&nbsp; }<br />
            }<br />
            add_action('manage_posts_custom_column', 'rating_column_content', 10, 2);</p>
            </td>
        </tr>
    </tbody>
</table>
<p><br />
这里用到了 manage_posts_custom_column Action,查看该Action的文档,我们可以知道该Action可以用来添加或修改列表的列,包括内建的以及自定义的列表列。该Action 接受两个参数,第一个是列表列的名字($column_name,即第一步中的&rsquo;rating&rsquo;,而非&rsquo;推荐指数&rsquo;),第二个是当前的文章ID($post_id)。根据这两个参数,我们就可以根据当前列的名字来获取文章的相关信息了。</p>
<p>这里通过判断当前列表列是不是&rsquo;rating&rsquo;,是则根据文章ID获取到推荐指数的值,并格式化输出。</p>
<p>接下来让他能够进行排序。通过 manage_edit-post_sortable_columns Filter来指定哪些列可以用来排序。</p>
<table style="background: #fb7" border="0" cellspacing="1" cellpadding="1" width="620" align="center">
    <tbody>
        <tr>
            <td bgcolor="#ffe7ce" height="27" width="464">&nbsp;代码如下</td>
            <td style="cursor: pointer" bgcolor="#ffe7ce" width="109" align="center" onClick="doCopy('copy6052')">复制代码</td>
        </tr>
        <tr>
            <td style="padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px" id="copy6052" class="copyclass" bgcolor="#ffffff" valign="top" colspan="2">
            <p>function rating_column_table_sorting( $columns ) {<br />
            &nbsp;&nbsp;&nbsp; $columns['rating'] = 'rating';<br />
            &nbsp;&nbsp;&nbsp; return $columns;<br />
            }<br />
            add_filter( 'manage_edit-post_sortable_columns', 'rating_column_table_sorting' );</p>
            </td>
        </tr>
    </tbody>
</table>
<p><br />
添加后,点击&ldquo;推荐指数&rdquo;列表头,可以看到页面的地址已经变到了排序的页面(/wp-admin/edit.php?orderby=rating&amp;order=asc),但是列表却并没有排序。这是因为WordPress并不如何根据&rsquo;rating&rsquo;来排序。</p>
<p>接下来就告诉WordPress如何根据&rsquo;rating&rsquo;排序。</p>
<table style="background: #fb7" border="0" cellspacing="1" cellpadding="1" width="620" align="center">
    <tbody>
        <tr>
            <td bgcolor="#ffe7ce" height="27" width="464">&nbsp;代码如下</td>
            <td style="cursor: pointer" bgcolor="#ffe7ce" width="109" align="center" onClick="doCopy('copy5265')">复制代码</td>
        </tr>
        <tr>
            <td style="padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px" id="copy5265" class="copyclass" bgcolor="#ffffff" valign="top" colspan="2">
            <p><br />
            function rating_column_orderby( $vars ) {<br />
            &nbsp;&nbsp;&nbsp; if ( isset( $vars['orderby'] ) &amp;&amp; $vars['orderby'] == 'rating' ) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $vars['orderby'] = 'meta_value_num';<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $vars['meta_key'] = '_rating';<br />
            &nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; return $vars;<br />
            }<br />
            add_filter( '<a target="_blank" href="/tags.php/request/">request</a>', 'rating_column_orderby' );</p>
            </td>
        </tr>
    </tbody>
</table>
<p><br />
这里我们通过改变request Filter,判断当前是否有&rsquo;orderby&rsquo;参数,以及是否等于&rsquo;rating&rsquo;,如果是,则将orderby=meta_value_num和meta_key=_rating加入到了当前请求的query vars中,这样WordPress就知道需要根据自定义字段&rsquo;_rating&rsquo;的整数顺序来排序。</p>
<p>至此,自定义文章列表列的功能已经实现。这里只是一个示例,稍作修改,便可以将&ldquo;推荐指数&rdquo;换成你文章中的任何数据,从而实现不同站点的不同需求。</p>
<p>另外,你是不是又注意到自己根据教程实现的效果有点不一样?你的&ldquo;推荐指数&rdquo;在最后一列?</p>
<p>告诉你一个小技巧,在第一段代码中,传给Filter的参数$columns,是一个列的数组,包含了所有的列的信息,在没有自定义列的情况下,返回的就是内建的列,其顺序如下:cb(复选框)、title(标题)、author(作者)、categories(分类目录)、tags(标签)、comments(评论)、date(日期)。如果要将自定义的列加到特定位置,就需要循环该数组,到特定位置时,再添加自定义的列,代码如下。如果需要删除某些列,在循环中删除该key=&gt;value即可(代码中注释的部分,删除了评论列)。</p>
<p>&nbsp;</p>
<table style="background: #fb7" border="0" cellspacing="1" cellpadding="1" width="620" align="center">
    <tbody>
        <tr>
            <td bgcolor="#ffe7ce" height="27" width="464">&nbsp;代码如下</td>
            <td style="cursor: pointer" bgcolor="#ffe7ce" width="109" align="center" onClick="doCopy('copy6612')">复制代码</td>
        </tr>
        <tr>
            <td style="padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px" id="copy6612" class="copyclass" bgcolor="#ffffff" valign="top" colspan="2">function add_rating_column($columns) {<br />
            &nbsp;&nbsp;&nbsp; $new = array();<br />
            &nbsp;&nbsp;&nbsp; <a target="_blank" href="/tags.php/foreach/">foreach</a>($columns as $key =&gt; $title) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($key == 'comments') {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $new['rating'] = '推荐指数';<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // if ($key == 'comments') {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; continue;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $new[$key] = $title;<br />
            &nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; return $new;<br />
            }</td>
        </tr>
    </tbody>
</table>
</div></td>
          </tr>
        </table><p class=tmpurl>原文转自:http://www.aips.me/ 感谢站长
公众微信:idc5ahl
公众QQ:吾爱互联
关注公众微信,公众QQ每天领现金卡密
卡密介绍(http://www.5ahl.com/thread-2182-1-1.html
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 点我注册

快速回复 返回顶部 返回列表