Циклические посты по категориям в пункте меню из функций PHP Wordpress - PullRequest
0 голосов
/ 06 декабря 2018

Прежде всего, 90% этого кода работает, просто нужно немного нажать: D

Все делается внутри functions.php

Я добавляюпункт в моем меню заголовка, где он должен динамически отображать некоторые сообщения в определенной категории.

Я получаю сообщения, используя функцию ниже, которая была взята и изменена для моих нужд отсюда

 function get_latest_post_thumbnails_urls() {
    // Set an empty variable which will hold our array of URL's
    $output = [];

    // Set our query args
    $args = [
        'posts_per_page' => 3,
        'fields'         => 'ids', // Only get post ID's
        'meta_query'     => [ // Get posts which has thumbnails only
            [
                'key'     => '_thumbnail_id',
                'compare' => 'EXISTS'
            ]
        ],
        'cat' => '5'
        // Any additional parameters you might need
    ];
    $q = get_posts( $args );

    // ALWAYS make sure we have posts, else return $output
    if ( !$q )
        return $output;

    // Ok, we have posts, lets loop through them and create an array of URL's
    foreach ( $q as $id ) 
        $output[] = wp_get_attachment_url( get_post_thumbnail_id( $id ) );

    // Return our array
    return $output;

}

Затем я использую функцию ниже, чтобы добавить пункт меню ( адаптировано отсюда ), но переменная не отображается в правильном месте во время цикла.<li> должен быть внутри <ul>.

add_filter('wp_nav_menu_items', 'add_admin_link', 10, 2);
function add_admin_link($items, $args){

    if( $args->theme_location == 'main_menu' ){
        $items .= '<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children dropdown menu-item-1441">
        <a class="sf-with-ul" title="Eventos" href="/eventos/"><span class="link-inner">EVENTOS <span class="nav-arrow top-level fa fa-angle-down"></span></span></a>

        <ul class="sub-menu" style="display: none;">'.
        $urls = get_latest_post_thumbnails_urls();
        if ( $urls ) {
                foreach ( $urls as $url ) {
                    // Do something with your thumbnail url
                    echo '<li>'. $url .'</li>';// For testing, remove this
                }
            }
        '</ul>
        </li>';
    }
    return $items;
}

Look the image the loop is working but is printed after the menu Как вы можете видеть на изображении, функция получает всеправильной информации, но она выводит ее до пункта меню.

//////////////// NEW CODE HELP //////////////////

add_filter('wp_nav_menu_items', 'add_admin_link', 10, 2);
function add_admin_link($items, $args){
    if( $args->theme_location == 'main_menu' ){
        //add your first few elements to the $items variable
        $items .= '<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children dropdown menu-item-1441">';
        $items .= '<a class="sf-with-ul" title="Eventos" href="/eventos/"><span class="link-inner">EVENTOS <span class="nav-arrow top-level fa fa-angle-down"></span></span></a>';
        $items .= '<ul class="sub-menu" style="display: none;">';


            $args = array(
                'post_type' => 'post',
                'posts_per_page' => -1,
                'cat' => '5'
            );

            $post_query = new WP_Query($args);
        if($post_query->have_posts() ) {
          while($post_query->have_posts() ) {
            $post_query->the_post();

            $items .= '<h2>'. the_title() .'</h2>';

          }
        };


        //close the dom elements
        $items .= '</ul>';
        $items .= '</li>';
    }
    //return the final product

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Функция для зацикливания полей записей ID

function get_latest_post_thumbnails_urls()
{
    // Set an empty variable which will hold our array of URL's
    $output = [];

    // Set our query args
    $args = [
        'posts_per_page' => -1,
        'fields'         => 'ids', // Only get post ID's
        'meta_query'     => [ // Get posts which has thumbnails only
            [
                'key'     => '_thumbnail_id',
                'compare' => 'EXISTS'
            ]
        ],
        'cat' => '5'
        // Any additional parameters you might need
    ];
    $q = get_posts( $args );

    // ALWAYS make sure we have posts, else return $output
    if ( !$q )
        return $output;

    // Ok, we have posts, lets loop through them and create an array of URL's
    foreach ( $q as $id ) 
        $output[] = $id;

    // Return our array
    return $output;

}

Функция для отображения пункта моего меню

function add_admin_link($items, $args){
    if( $args->theme_location == 'main_menu' ){
        //add your first few elements to the $items variable
        $items .= '<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children dropdown menu-item-1441">';
        $items .= '<a class="sf-with-ul" title="Eventos" href="/eventos/"><span class="link-inner">EVENTOS <span class="nav-arrow top-level fa fa-angle-down"></span></span></a>';
        $items .= '<ul class="sub-menu" style="display: none;">';

        $urls = get_latest_post_thumbnails_urls();
        if ( $urls ) {
            //loop through your url's
            foreach ( $urls as $url ) {
                //add each url onto the $items variable
                $items .= '<li><a href="'. get_permalink($url) .'"><span class="link-inner">'. get_the_title($url) .'</span></a></li>';
            }
        }

        //close the dom elements
        $items .= '</ul>';
        $items .= '</li>';
    }
    //return the final product
    return $items;
}

Функция для позиционирования пункта меню в меню

add_filter( 'wp_nav_menu_objects', 'restructure_menu_links', 10, 2 );

function restructure_menu_links( $reorgitems, $args ) {

    $new_links = array();

    $label = add_admin_link($items, $args);    // add your custom menu item content here

    // Create a nav_menu_item object
    $item = array(
        'title'            => $label,
        'menu_item_parent' => 0,
        'ID'               => 'hidden',
        'db_id'            => '',
        'url'              => $link,
        'classes'          => array( 'menu-item' )
    );

    $new_links[] = (object) $item; // Add the new menu item to our array

    // insert item
    $location = 2;   // insert at 3rd place
    array_splice( $reorgitems, $location, 0, $new_links );

    return $reorgitems;
}

Я знаю, что это не идеально, но я благодарю @Frits за помощь, которую я наконец-то добился, чтобы она работала в моем направлении _:)

И желаю вам сделать это лучше;)

0 голосов
/ 06 декабря 2018

Ошибка, с которой вы имеете дело, возникает из-за того, что вы выводите $url переменные до , вы возвращаете пункты меню.

Чтобы устранить эту проблему, вместо вывода URL-адресов внутри вашегоцикл, добавьте их в переменную $items (используя .=, как вы делали раньше), а затем верните $items, как вы уже делали.

add_filter('wp_nav_menu_items', 'add_admin_link', 10, 2);
function add_admin_link($items, $args){
    if( $args->theme_location == 'main_menu' ){
        //add your first few elements to the $items variable
        $items .= '<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children dropdown menu-item-1441">';
        $items .= '<a class="sf-with-ul" title="Eventos" href="/eventos/"><span class="link-inner">EVENTOS <span class="nav-arrow top-level fa fa-angle-down"></span></span></a>';
        $items .= '<ul class="sub-menu" style="display: none;">';
        $urls = get_latest_post_thumbnails_urls();
        if ( $urls ) {
            //loop through your url's
            foreach ( $urls as $url ) {
                //add each url onto the $items variable
                $items .= '<li>'. $url .'</li>';
            }
        }
        //close the dom elements
        $items .= '</ul>';
        $items .= '</li>';
    }
    //return the final product
    return $items;
}

Вы также можете объединить обаваши функции в особую функцию, запустив ваш WP_Query внутри фильтра меню.

Если вы сделаете это таким образом, вам будет проще добавлять дополнительную информацию о записи в ваши пункты меню.

Вот пример, который добавляет выбранное изображение, обернутое в ссылку на сообщение, с добавлением заголовка сообщения в качестве атрибута title ссылки:

add_filter('wp_nav_menu_items', 'add_admin_link', 10, 2);
function add_admin_link($items, $args){
    if( $args->theme_location == 'main_menu' ){
        //add your first few elements to the $items variable
        $items .= '<li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children dropdown menu-item-1441">';
        $items .= '<a class="sf-with-ul" title="Eventos" href="/eventos/"><span class="link-inner">EVENTOS <span class="nav-arrow top-level fa fa-angle-down"></span></span></a>';
        $items .= '<ul class="sub-menu" style="display: none;">';
        $urls = get_latest_post_thumbnails_urls();

        //build you arguments for the wp query
        $args = array(
            'post_type'     => 'post',
            'posts_per_page'=> -1,
            'tax_query' => array( //only get posts in category 5
                array(
                    'taxonomy' => 'category',
                    'field'    => 'term_id',
                    'terms'    => 5,
                ),
            ),
            'meta_query' => array( //only get posts that have a thumbnail
                array(
                    'key' => '_thumbnail_id',
                    'compare' => 'EXISTS'
                ),
            )
        );

        //create the query and loop through it
        $query = new WP_Query($args);
        if($query->have_posts()) {
            while($query->have_posts()) {
                $query->the_post();
                $thumbnail_id   = get_post_thumbnail_id(); //get the thumbnail id
                $image_src      = wp_get_attachment_image_src($thumbnail_id, 'full')[0]; //you can use either full/large/medium/thumbnail
                $items        .= '<li><a href="'.get_the_permalink().'" title="'.get_the_title().'"><img src="'.$image_src.'"></a></a></li>';
            }
        }
        wp_reset_postdata();

        //close the dom elements
        $items .= '</ul>';
        $items .= '</li>';
    }
    //return the final product
    return $items;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...