wp_query-> max_num_pages всегда возвращает 0 для пользовательского типа записи - PullRequest
0 голосов
/ 01 октября 2019

У меня проблема с разбиением на страницы, которая, кажется, связана с тем фактом, что $wp_query->max_num_pages возвращает 0.

Я считаю, что это связано с 0 сообщениями WordPress по умолчанию.

Итак, я использую плагин WP Download Manager Pro , который создает пользовательский тип записи wpdmpro.

У меня есть страницы для каждой категории, и, используя цикл, яперебирайте каждое сообщение с post-type из wpdmpro.

<?php
    $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
    $args = array(
        'orderby'           => 'date',
        'order'             => 'DESC',
        'post_status'       => 'publish',
        'posts_per_page'    => 2,
        'paged'             => $paged,
        'post_type' => 'wpdmpro', 
        'wpdmcategory' => $category->category_nicename,
        'tag' => $cat_tag
    );
    query_posts($args)
?>
<?php if (have_posts()) : ?>
   /* content goes here */
<?php endif; ?>
<?php else : ?>

    <div class="row">
        <h2 class="center">Not Found</h2>
        <p class="center">Sorry, but you are looking for something that isn't here.</p>
        <?php get_search_form(); ?>
    </div>

<?php endif; ?>
echo $wp_query->max_num_pages /* returns 0 */
echo $wp_query->found_posts   /* returns 0 */

Хотя у меня на самом деле есть 11 сообщений в wpdmpro post_type. Так почему эхо не делает следующее?

echo $wp_query->max_num_pages /* Should return 2 because I have 11 posts with 10 per page */
echo $wp_query->found_posts   /* Shoudl return 11 because I have 11 posts */

Попробовал следующее, чтобы увидеть, будет ли это работать

  add_action( 'pre_get_posts', 'action_pre_get_posts' );
  function action_pre_get_posts( $q ) 
  {
    $q->set('max_num_pages', 20);
  }

Но при переходе к page/2/ я все равно получаю страницу 404.

URL, который я нажимаю, - /category-name/page/2, который возвращает 404.

Должно быть решение для этого?

Как заставить мой сайт игнорироватьстандартные типы сообщений WordPress и использовать то, что я на самом деле определяю, wpdmpro типы сообщений?

Редактировать: я тоже пытался использовать класс WP_Query, но при переходе к * 1041 все еще нажимал на страницу 404. *

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

В моих настройках постоянных ссылок у меня есть пользовательская структура

/%category%/%postname%/

и моя категория по умолчаниюbase .

В моих настройках WP Download Manager мой WPDM Category URL Base равен .

У меня также есть эти 2 функции фильтра, которые были скопированы из ответов здесь, и яя новичок в Wordpress, поэтому я не уверен в возможных последствиях их использования?

add_filter('category_rewrite_rules', 'vipx_filter_category_rewrite_rules');
add_filter('user_trailingslashit', 'remove_category', 100, 2);
function vipx_filter_category_rewrite_rules($rules) {
    $categories = get_categories(array('hide_empty' => false));

    if (is_array($categories) && !empty($categories)) {
        $slugs = array();
        foreach($categories as $category) {
            if (is_object($category) && !is_wp_error($category)) {
                if (0 == $category - > category_parent) {
                    $slugs[] = $category - > slug;
                } else {
                    $slugs[] = trim(get_category_parents($category - > term_id, false, '/', true), '/');
                }
            }
        }

        if (!empty($slugs)) {
            $rules = array();

            foreach($slugs as $slug) {
                $rules['('.$slug.
                    ')/feed/(feed|rdf|rss|rss2|atom)?/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
                $rules['('.$slug.
                    ')/(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
                $rules['('.$slug.
                    ')(/page/(\d+)/?)?$'] = 'index.php?category_name=$matches[1]&paged=$matches[3]';
            }
        }
    }
    return $rules;
}

function remove_category($string, $type) {
    if ($type != 'single' && $type == 'category' && (strpos($string, 'category') !== false)) {
        $url_without_category = str_replace("/wpdmcategory/", "/", $string);
        return trailingslashit($url_without_category);
    }
    return $string;
}

Я также убедился, что ни один из постов-слагов не конфликтовал с названием категории.

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

На случай, если кто-нибудь когда-нибудь наткнется на это, я нашел решение.

Первым шагом было создание archive.php страницы

Там я бы получил доступ к циклу.

In functions.php

У меня есть фильтр перезаписи категорий, чтобы обновить правила переписывания категорий, чтобы использовать следующий пример URL index.php?wpdmcategory=category-name&paged=2, когда я нажимаю /category-name/page/2

Ранееиспользовал следующий пример URL, index.php?category_name=category-name&paged=2, поэтому он фактически использовал тип публикации по умолчанию для подкачки категории.

add_filter( 'category_rewrite_rules', 'vipx_filter_category_rewrite_rules' );`

function vipx_filter_category_rewrite_rules($rules) {
    $categories = get_terms('wpdmcategory', array("hide_empty" => false));

    if (is_array($categories) && !empty($categories)) {
        $slugs = array();
        foreach($categories as $category) {
            if (is_object($category) && !is_wp_error($category)) {
                if (0 == $category - > category_parent) {
                    $slugs[] = $category - > slug;
                } else {
                    $slugs[] = trim(get_category_parents($category - > term_id, false, '/', true), '/');
                }
            }
        }

        if (!empty($slugs)) {
            $rules = array();

            foreach($slugs as $slug) {
                $rules['('.$slug.
                    ')/feed/(feed|rdf|rss|rss2|atom)?/?$'] = 'index.php?wpdmcategory=$matches[1]&feed=$matches[2]';
                $rules['('.$slug.
                    ')/(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?wpdmcategory=$matches[1]&feed=$matches[2]';
                $rules['('.$slug.
                    ')(/page/(\d+)/?)?$'] = 'index.php?wpdmcategory=$matches[1]&paged=$matches[3]';
            }
        }
    }
    return $rules;
}
0 голосов
/ 01 октября 2019

Вы действительно должны избегать query_posts(), когда можете, выбирая вместо WP_Query класс . Примерно так:

<?php
// Args
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array(
    'orderby'           => 'date',
    'order'             => 'DESC',
    'post_status'       => 'publish',
    'posts_per_page'    => 2,
    'paged'             => $paged,
    'post_type'         => 'wpdmpro', 
    'wpdmcategory'      => $category->category_nicename,
    'tag'               => $cat_tag
);

// Query
$wpdmpro_query = new WP_Query( $args );

// The Loop
if( $wpdmpro_query->have_posts() ) : while( $wpdmpro_query->have_posts() ) : $wpdmpro_query->the_post();
?>
    <!-- Do stuff -->

<?php endwhile; ?>

    <!-- Do stuff if there are no posts -->

endif; wp_reset_postdata(); ?>

А затем для проверки max_num_pages вы бы использовали запрос:

echo $wpdmpro_query->max_num_pages

Надеюсь, это поможет!

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