Повысить производительность запросов в wp_posts, через wp_get_nav_menu_items, используя пользовательский SQL-запрос в WordPress - PullRequest
0 голосов
/ 10 апреля 2019

Сегодня я столкнулся с проблемой, которая заметно замедляет работу сайта. В моем заголовке загружаются категории меню (имя меню -> header_nav). Я загружаю их с помощью функции, например wp_get_nav_menu_items ($ menu-> term_id). Эта функция возвращает массив объектов, в которых много полей, так как есть много категорий, а также много объектов. Из всего объекта мне нужны только $ object-> title, $ object-> link, $ object-> id. Мне нужно получить эти данные из многоязычных названий.

//$menu_items too large array of objects

$menu = wp_get_nav_menu_object( $locations[ 'menu_slug'] );

//Here my array. do foreach and creating category menu using  
//$menu_item->title...and etc.
$menu_items = wp_get_nav_menu_items($menu->term_id);  

И я решил написать свой запрос. Но он возвращает данные без многоязычности

    SELECT p2.ID, p2.post_title, p2.post_name, p2.guid, 
    p1.post_parent
    FROM wp_posts p1
    INNER JOIN wp_term_relationships AS TR
    ON TR.object_id = p1.ID
    INNER JOIN wp_postmeta AS pm
    ON pm.post_id = p1.ID
    INNER JOIN wp_posts AS p2
    ON p2.ID = pm.meta_value
    WHERE p1.post_type = 'nav_menu_item'
    AND TR.term_taxonomy_id = $taxId
    AND pm.meta_key = '_menu_item_object_id'
    ORDER BY p1.menu_order ASC

Как вернуть уже переведенные названия?

1 Ответ

0 голосов
/ 11 апреля 2019
 SELECT * FROM wp_posts p1 INNER JOIN wp_term_relationships AS TR ON TR.object_id = 
 p1.ID INNER JOIN wp_postmeta AS PM ON pm.post_id = p1.ID INNER JOIN wp_posts AS p2 ON 
 p2.ID = PM.meta_value WHERE p1.post_type = 'nav_menu_item' AND TR.term_taxonomy_id = ( 
 SELECT wp_terms.term_id FROM wp_terms WHERE slug = 'pedik') AND pm.meta_key = 
 '_menu_item_object_id' ORDER BY p1.menu_order ASC

для заголовка

 $menu_item->object_id = ! isset( $menu_item->object_id ) ? get_post_meta( 
 $menu_item- 
 >ID, '_menu_item_object_id', true ) : $menu_item->object_id;

для URL

 $menu_item->url = get_permalink( $menu_item->object_id );

для заголовка

 $original_title = apply_filters( 'the_title', $original_object- 
 >post_title,$original_object->ID );
 if ( '' === $original_title ) {
                /* translators: %d: ID of a post */
                $original_title = sprintf( __( '#%d (no title)' ), $original_object- 
 >ID );
            }

            $menu_item->title = '' == $menu_item->post_title ? $original_title : 
 $menu_item->post_title;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...