组合GET_PAGE_BY_TITLE可从wp_list_ages中排除页面

时间:2017-12-15 作者:Josh Rodgers

我正在使用get_page_by_title 从中排除几页wp_list_pages, 我的代码如下所示:

<?php
    $page1 = get_page_by_title(\'title1\');
    $page2 = get_page_by_title(\'title2\');
    wp_list_pages("title_li=&exclude=\'.$page1->ID.\',\'.$page2->ID.\'")
?>
这段代码可以工作,但我想知道是否有任何方法可以将其组合起来,使其更短-例如:

<?php
    $pages = get_page_by_title(array(\'title1\',\'title2\'));
    wp_list_pages("title_li=&exclude=\'.$pages->ID.\'")
?>
这不管用,但我觉得很接近。。。只是觉得代码可以简化一点。

有什么想法吗?

谢谢,乔希

1 个回复
最合适的回答,由SO网友:David Sword 整理而成

get_page_by_title() 源代码显示它只运行一个mysql查询。通过编写自定义查询,可以将函数的两个调用简化为一个查询:

global $wpdb;

$qry = "SELECT ID FROM $wpdb->posts WHERE (post_title = %s OR post_title = %s) AND post_status = \'publish\'";
$sql = $wpdb->prepare($qry, \'title1\', \'title2\' );
$res = $wpdb->get_results( $sql );

$getIDs = array();
foreach ($res as $result)
    $getIDs[] = $result->ID;

$exclude = implode(\',\', $getIDs);
但是,我认为应该简化它,在其中添加缓存以减少_posts 对于这样一件小事:

global $wpdb;

if ( false === ( $exclude = get_transient( \'myplugin_exclude\' ) ) ) {
    $qry = "SELECT ID FROM $wpdb->posts WHERE (post_title = %s OR post_title = %s) AND post_status = \'publish\'";
    $sql = $wpdb->prepare($qry, \'title1\', \'title2\' );
    $res = $wpdb->get_results( $sql );

    $getIDs = array();
    foreach ($res as $result)
        $getIDs[] = $result->ID;

    $exclude = implode(\',\', $getIDs);
    set_transient( \'myplugin_exclude\', $exclude, 60*60*24 ); // once a day
}

wp_list_pages("title_li=&exclude={$exclude}");
现在它很长,我想将其包装在函数中不会有什么坏处-有助于保持事物的整洁并有助于重用:

function get_two_pages_ids_by_titles($title1,$title2,$name) {
    global $wpdb;

    if ( false === ( $exclude = get_transient( $name ) ) ) {
        $qry = "SELECT ID FROM $wpdb->posts WHERE (post_title = %s OR post_title = %s) AND post_status = \'publish\'";
        $sql = $wpdb->prepare($qry, $title1, $title2 );
        $res = $wpdb->get_results( $sql );

        $getIDs = array();
        foreach ($res as $result)
            $getIDs[] = $result->ID;

        $exclude = implode(\',\', $getIDs);
        set_transient( $name, $exclude, 60*60*24 ); // once a day
    }
    return $exclude;
}
然后你可以简单地做:

<?php
    $exclude = get_two_pages_ids_by_titles(\'title1\',\'title2\',\'listpages_exclude\');
    wp_list_pages("title_li=&exclude=".$exclude);
?>
显然get_two_pages_ids_by_titles 有点傻,太具体了。接受一个标题数组并返回一个ID会更好,但这应该有助于引导一种获取所需内容的方法。

希望这有帮助。

结束

相关推荐

如何从WordPress页面的<title>标记中删除特定字符串

我有一些标题中有特定字符串的页面,例如“ASDF”。我想从中删除此特定字符串<title> 标记由我的主题生成的HTML。在我的功能中。php主题文件,有一行:add_theme_support( \'title-tag\' ); 在我的标题中。php主题文件,有一行: wp_head(); 最后一行生成一个标题标记,该标记(例如)如下所示:<title>Blah Blah ASDF &#8211; Blog Name</title>&