Вернуть все имена страниц в WordPress, без лишних слов? - PullRequest
0 голосов
/ 20 января 2011

Мне нужно получить массив каждого имени страницы, зарегистрированного в WordPress. У меня есть две проблемы, я могу сделать get_pages () и тому подобное, но он буквально тянет каждую чертову вещь на каждой странице, включая их содержимое. Совершенно ненужные накладные расходы, когда все, что мне нужно, это имя_страницы для каждого.

Другое - то, что я хотел бы сделать это с помощью встроенного метода, если это возможно, так как это для внутреннего плагина, и мы хотим, чтобы он был совместим с основной линией. (наихудший случай - просто обратиться к БД напрямую и получить их). Я знаю, что вы можете включить / исключить в вызове get_pages (), но я не понял, можно ли исключить получение всего, кроме одного, вместо противоположного.

Он должен быть динамическим в том смысле, что в нем не может быть жестко закодированных строк, то есть ничего не знать о самих страницах или о том, как они называются. Также нет лишнего мусора, как в неупорядоченном списке или что-то в этом роде. Прямой массив, уровни не нужны. (подстраницы указаны как первичные)

Есть идеи, ребята? Я искал и искал ... но документация запаздывает для таких вещей, как вы, ребята, наверное знаете.

Спасибо.

Пример того, что я хотел бы в конце или подобное:

Array
(
    [0] => stdClass Object
        (
            [page_name] => 'page1'
        )
    [1] => stdClass Object
        (
            [page_name] => 'page2'
        )
    [2] => stdClass Object
        (
            [page_name] => 'page3'
        )
    [3] => stdClass Object
        (
            [page_name] => 'page4'
        )
)

Ответы [ 3 ]

2 голосов
/ 20 января 2011

Чтобы ограничить возвращаемые поля, вы можете настроить фильтр. В вашем файле functions.php тем или плагине попробуйте

add_filter( 'get_pages', 'get_pages_filter' );

function get_pages_filter( $res ){
    $res = array_map( 'get_pages_title', $res ); 
    return $res;
}

function get_pages_title( $item ){
    return (object) array( 'page_name' => $item->post_name );
}

$pages = get_pages();
var_dump( $pages );
0 голосов
/ 20 января 2011

Если у кого-то есть чистое решение, пожалуйста, включите его. Пока я просто собираюсь использовать встроенное в БД соединение WordPress и беру их вручную.

Для любопытных ... Я просто бросил это вместебыстро ... наверное, не самый лучший ..

/**
 * get_wpdb_values()
 *
 * DESC:
 *
 * Allows you to make a WP Database connection
 * and return an Array => Object of what ever
 * values you need from a table.
 *
 * Was made for the purpose of returning a page
 * list, but since you pass it the field you
 * want returned, along with with optional filters
 * it can easily be used for other purposes.
 *
 * USAGE:
 *
 * array get_wpdb_values ( string $table [, string $field [, array $filters ]] )
 *
 * PARAMETERS:
 *
 * ----------|-----------------------------------------------------------------
 * $table    | Required table you want to return values from.
 *           | DO NOT INCLUDE THE WP PREFIX! (e.g. use 'posts' not 'wp_posts'
 * ----------|-----------------------------------------------------------------
 * $field    | Optional field name you want returned. (Default returns * all)
 * ----------|-----------------------------------------------------------------
 * $filters  | Optional filtering passed as field => value array.
 * ----------|-----------------------------------------------------------------
 */

function get_wpdb_values( $table = null,
                          $field = "*",
                          $filters = null )
{
    // Get access to the
    // WordPress Database
    // class in this scope

    global $wpdb;

    // If we weren't passed any
    // arguments, get out quick

    if(is_null($table) || empty($table))
        return false;

    // Add optional filters if
    // they were passed in

    if(!is_null($filters))
    {
        // Counter is so we can tell
        // if there is more then one
        // filter so we can add the
        // AND separator in the
        // SQL query

        $WHERE  = "WHERE ";
        $counter = 0;

        foreach ($filters as $key => &$value)
        {
            $counter++;

            // If we're on the second or more
            // pair, we add the AND to chain
            // conditional WHERE's

            $AND = ($counter >= 2) ? " AND" : null;

            // Append to existing WHERE 
            // statement

            $WHERE .= "$AND $key = '$value' ";
        }
    }
    else
    {
        // No filters passed

        $WHERE = null;
    }

    // Get WordPress formatted
    // table name

    $wp_table = $wpdb->$table;

    // Putting it all together

    $query = "SELECT $field FROM $wp_table $WHERE ";

    // Make actual DB call
    // through the built in
    // MySQL interface for
    // WordPress to at least
    // attempt to remain
    // compatible with mainline

    return $wpdb->get_results($query);
}
0 голосов
/ 20 января 2011

Я проверил get_pages() исходный код , и вы никак не можете ограничить то, что запрашивается из базы данных. Страницы извлекаются по строкам 3177-3184 , и, как вы можете видеть, существует жестко запрошенный SELECT * FROM запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...