基于模板生成帖子目录

时间:2013-04-23 作者:jchwebdev

是否有基于页面模板打印帖子/页面/自定义帖子类型层次结构的方法?

例如,我经常被要求查看另一个网站,我希望能够“查看”分配给“新闻稿”PHP模板的所有页面以及分配给“产品信息”PHP模板的所有页面。

是否有这样的插件或可以推荐的代码?

2 个回复
最合适的回答,由SO网友:fuxia 整理而成

要按模板对所有帖子进行排序,您需要两个函数:一个用于查询,另一个用于添加自定义顺序。

获取帖子

function get_posts_by_template()
{
    add_filter( \'posts_orderby\', \'orderby_template\' );

    $query = new WP_Query(
        array(
            //\'meta_key\' => \'_wp_page_template\',
            \'post_type\' => \'any\',
            \'orderby\'  => \'title\',
            \'order\'    => \'ASC\',
            \'posts_per_page\' => -1, // dangerous
            \'meta_query\' => array(
                array(
                    \'key\' => \'_wp_page_template\',
                    \'value\' => \'\',
                    \'compare\' => \'!=\'
                )
            )
        )
    );

    if ( empty ( $query->posts ) )
        return FALSE;

    return $query->posts;
}
更改顺序
function orderby_template( $orderby )
{
    global $wpdb;

    remove_filter( current_filter(), __FUNCTION__ );
    $orderby = $wpdb->postmeta . \'.meta_value DESC, \' . $orderby;

    return $orderby;
}
要获得良好的概述,我们可以使用以下内容:

function list_posts_by_template()
{
    $posts = get_posts_by_template();

    if ( ! $posts )
        return print \'no posts with a template found\';

    static $template = \'\';

    foreach ( $posts as $post )
    {
        $post_template = get_post_meta( $post->ID, \'_wp_page_template\', TRUE ) . \'<br>\';

        if ( $post_template !== $template )
        {
            print "<h2>$post_template</h2>";
            $template = $post_template;
        }

        printf(
            \'<p><a href="%1$s">%2$s</a></p>\',
            get_permalink( $post->ID ),
            esc_html( $post->post_title )
        );
    }
}

SO网友:s_ha_dum

我不确定您在什么情况下需要此功能,但指定的页面模板保存在$wpdb->postmeta_wp_page_template 这样你就可以做像。。。

$templates = $wpdb->get_results("SELECT * FROM {$wpdb->postmeta} WHERE meta_key = \'_wp_page_template\'");
var_dump($templates);
。。。要获取模板。。。

$args = array(
  \'post_type\' => \'any\',
  \'meta_query\' => array(
    array(
      \'key\' => \'_wp_page_template\',
       \'compare\' => \'EXISTS\',
    )
  )
);
$t = new WP_Query($args);
var_dump($t);
。。。让帖子与之进行比较。它们由ID == post_id

我想你可以把这两者结合起来。。。

$templates = $wpdb->get_results(
  "SELECT post_id,meta_value,post_title 
  FROM {$wpdb->postmeta} 
  JOIN {$wpdb->posts} ON {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id
  WHERE meta_key = \'_wp_page_template\'");
var_dump($templates);
您无法获取automagically assigned templates 这样,如果你需要的话。

结束