Suporte » Plugins » Problema com paginação

  • Resolvido romanino

    (@romanino)


    Pessoal,

    Estou tentando personalizar a página index.php da categoria principal do meu blog… porem estou tendo dificuldades com a paginação.

    Nesta página será listado todos os posts das categorias filhas, só que com um porém… quero exibir apenas um post de cada categoria filha e não todos os posts existentes… usei o seguinte código:

    <?php  
    
    global $ancestor;
    wp_reset_query(); 
    
    // Pega todas as subcategorias da categoria mãe de id=4
    $childcats = get_categories('orderby=ID&order=desc&child_of=4&show_count=1'); 
    
    echo '<div id="noticias-des-galery" class="clearfix">'; 
    
    foreach ($childcats as $childcat) {  
    
    // Query nas categorias
    query_posts('cat='. $childcat->cat_ID . "&showposts=1&paged=$paged");
    if (have_posts()) :
    while (have_posts()) :
    the_post();
    include(TEMPLATEPATH . '/includes/entry-galery.php');
    $i++;
    endwhile;
    else :
    include(TEMPLATEPATH . '/includes/no-results.php');
    endif; wp_reset_query();
    }
    echo '</div><div class="clear"></div>';
    if(function_exists('wp_pagenavi')) { wp_pagenavi(); }
    else {
    include(TEMPLATEPATH . '/includes/navigation.php');
    }
    ?>

    O código acima lista todas as categorias filhas existentes exibindo um post de cada na pagina da categoria pai … porém a paginacao ficou completamente comprometida, sendo que no admin está apara exibir 4 posts por paginas… e ele está exibindo todas as categorias com a paginacao exibindo sempre os mesmos posts. Alguém saberia como resolver o problema da paginacao?

Visualizando 12 respostas - 1 até 12 (de um total de 12)
  • Criador do tópico romanino

    (@romanino)

    Uma solução que imaginei foi paginar por categorias existentes e não por post… Tem como customizar isso? um plugin?

    Tente isso

    $paged = (get_query_var('paged'));
    query_posts('cat='. $childcat->cat_ID . "&showposts=1&paged=$paged");

    vc já tinha colocado o paged, mas ele não estava pegando nada, talvez atribuindo ao númro de página a variável $paged resolva.

    E o que o wp_reset_query(); tá fazendo no início do seu código?

    Se não me engano ele não está fazendo nada, ou está estragando alguma coisa.
    Porque se estou certo ele deve ser usado depois de um loop ou query_posts para não afetar o próximo e neste caso ele está antes de todos os loops.

    Acho que não dá pra resolver assim, porque na verdade ele está criando vários loops, um para cada categoria filha, e cada um com apenas 1 post. Então, a paginação não vai ser ativada em nenhum momento.

    Acho que é complicado de fazer isso. Deve ser possível, claro, mas é complicado… A solução deve envolver fazer um contador no foreach, e quando chegar a 10 ou o valor que quiser, parar o foreach e criar o link, passando um argumento para a própria página (pode ser o próprio $paged).

    Aí, antes de começar o foreach tem que ter um teste pra saber se está na página 1, ou 2, ou 3…

    Só que o $paged não pode ser chamado no query_posts, e sim no foreach…

    Complicado!

    Criador do tópico romanino

    (@romanino)

    Valew pelas dicas… Eu não tenho muita experiência com o PHP e esta foi a única maneira que encontrei de listas apenas um post por categoria… cada categoria possuiem vários posts… mas quero que apareça a penas o última na página principal da categoria pai…

    A minha estritura é a seguinte… em uma categoria pai (galeria de fotos) possuem N categorias que com o tempo vão crescendo (galeria de fotos 1, galeria de fotos 2 e assim vai)… Neste caso quem tem que determinar a paginação seria o numero de categorias criadas… tipo para cada página 10 categorias novas devem ser apresentadas… Fucei… Fucei e nada de encontrar uma solução… Se alguém souber um método para fazer isso ou apenas me indicar o caminho das pedras ficarei muito rato a todos. Abs!

    Criador do tópico romanino

    (@romanino)

    Olha só… esse é meu código original:

    <?php get_header(); ?>
    
    <?php if (is_archive()) $post_number = get_option('tema');
    if (is_search()) $post_number = get_option('tema');
    if (is_tag()) $post_number = get_option('tema');
    if (is_category()) $post_number = get_option('tema'); ?>
    
    <?php $i = 1; ?>
    ?php global $query_string;
    if (is_category()) query_posts($query_string . "&showposts=$post_number&paged=$paged&cat=$cat");
    else query_posts($query_string . "&showposts=$post_number&paged=$paged&order=desc"); ?>
    
    <?php 								echo '<div id="noticias-des-galery" class="clearfix">';
    	if (have_posts()) : while (have_posts()) : the_post(); 	include(TEMPLATEPATH . '/includes/entry-galery.php');
    	$i++;
    	endwhile;
    	else :
    	include(TEMPLATEPATH . '/includes/no-results.php');
    	endif; wp_reset_query();
    	echo '</div><div class="clear"></div>';
    	if(function_exists('wp_pagenavi')) { wp_pagenavi(); }
    	else {
    	include(TEMPLATEPATH . '/includes/navigation.php');
    	}
    ?>
    </div><?php get_sidebar(); ?>

    Com ele funciona a paginacao mas o problema é que ele lista todos os posts de todas as categorias e o que estou precisando é listar apenas um post de cada categoria filha… Alguém gostaria de arriscar um palpite?

    Abs!

    Criador do tópico romanino

    (@romanino)

    é tá complicado isso ai e acho que o que o renato_s faz todo o sentido.

    Mas vc já conseguiu listar as categorias e seus posts como vc está querendo mesmo dando erro na paginação?

    É que eu aqui não tenho a mesma estrutura de categorias que vc e fica complicado pra testar sem isso, se vc já tiver o código gerando os posts e categorias como vc está querendo só que com problema de paginação fica mais fácil de testar.

    Criador do tópico romanino

    (@romanino)

    <?php
    global $ancestor;
    $childcats = get_categories('orderby=ID&order=desc&child_of=4&show_count=1');
    echo '<div id="noticias-des-galery" class="clearfix">';
    foreach ($childcats as $childcat) {  
    
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    query_posts('cat='. $childcat->cat_ID . "&showposts=1&paged=$paged");
    
    if (have_posts()) : while (have_posts()) : the_post();
    include(TEMPLATEPATH . '/includes/entry-galery.php');
    endwhile;
    else :
    include(TEMPLATEPATH . '/includes/no-results.php');
    endif; wp_reset_query();
    }
    echo '</div><div class="clear"></div>';
    ?>

    O código que lista as um post de cada categoria é esse só que tem o problema da paginação…

    romanino minhas categorias estão uma bagunça que nem sei o que está me retornando está certo ou errado, acho que terei que fazer uma nova instalação e cadastrar categorias novas para testar.

    mas em seu código tem uma grande problema, vc está fazendo um loop dentro de um foreach que basicamente é um loop.

    Minha sugestão, se este código está funcionando para vc tente fazer algumas pequenas mudanças que vou sugerir.

    troque
    if (have_posts()) : while (have_posts()) : the_post();
    por isso somente
    the_post();

    se vc está fazendo um foreach com query_posts não tem porque fazer o loop, só o the_post(); já irá lhe retornar os posts.

    ai então vc terá que remover os endwhile; else: endif; já que vc não estará mais usando o loop.

    outra coisa, inclua a paginação depois do fechamento do foreach

    endif; wp_reset_query();
    }
    if(function_exists('wp_pagenavi')) { wp_pagenavi(); }

    Tente pra ver no que dá, eu ainda não desisti, mas no momento estou ocupado e com pouco tempo para fazer testes, mas como eu adoro configurar os possíveis loops do WP não me dei por vencido.

    Criador do tópico romanino

    (@romanino)

    Myst1010… valeu pela ajuda. Você está certo quanto ao while dentro do forearch, tanto que já modifiquei no meu código… Só que o problema da paginação ainda persiste… Esta acontecendo de ele listar todas as categorias existentes e dessa forma a paginação nunca vai existir mesmo… tipo no foreach eu teria que ter um limitador como mencionou o renato_s. Só que eu não faço idéia de como poderia fazer isso… Outra questão, no meu caso eu possuo 10 categorias com 4 posts cada…

    A paginação tá sendo gerada pelos posts que no total são 40. Como eu determinarei para que o wordpress pagine contando a quantidade de posts que está sendo exibido? no caso apenas 10 (um para cada categoria). Acredito que o fato do query_post estar dentro de um Loop isso complica bastante. O que você acha?

    romanino esse loop tá complicado pracas, as vezes acho até que consegui, mas as minhas categorias deixam em dúvida.

    Eu não pude usar o seu código como estava, além de fazer includes de arquivos que eu não tenho aqui não estava me retornando nada devido ao parâmetro child_of.

    Então dei uma modificada para começar a me retornar alguma coisa.

    Do jeito que está o código, aqui ele está me retornando 1 só post de cada categoria e me retornando a paginação blz, MAS o infeliz está me retornando alguns posts quem nem eu sei o que são (isso pode ser por causa da minha bagunça de testar códigos nessa instalação).

    Além disso está me retornando muito mais posts do que configurado em qualquer lugar, nem sei que critério ele está tendo para criar a paginação, já que não respeita o posts_per_page nem o número de posts que configurei na administração.

    Dá uma testada ai com suas categorias e me diz como está ai ok.

    <?php
    global $ancestor;
    
    $childcats = get_categories('orderby=id&order=desc&parent=0');
    
    foreach ($childcats as $childcat):
    
    $paged = (get_query_var('paged'));
    query_posts('cat='. $childcat->cat_ID . "&posts_per_page=1&paged=$paged");
    
    the_post(); ?>
    
    	<div <?php post_class('post-arquivos post-arquivos-left')?>>
    		<?php if(the_thumb_imagem()) { ?>
    		<a href="<?php the_permalink() ?>" title="<?php the_title(); ?>">
    		<img class="thumb" src="<?php bloginfo('template_directory'); ?>/scripts/timthumb.php?src=<?php echo the_thumb_imagem();?>&w=200&h=150&zc=1&a=t"
    		alt="<?php the_title_attribute(); ?>" width="200" height="150"/></a>
    		<?php } else { ?>
    		<a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"> <img src="<?php bloginfo('template_directory') ?>/images/no-imagem-arquivos.png"
    		alt="sem imagem" width="200" height="150" class="thumb" /> </a>
    		<?php } ?>
    
    		<h3 class="titulo"><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php truncate_title(45); ?></a></h3>
    		<?php the_time('j \d\e\ F \d\e\ Y'); edit_post_link('Editar'); ?>
    		<br />
    		<?php limit_post('limite_post_arquivos', 'leia_mais'); ?>
    		<div class="post-info">
    			<span><strong>Categoria: </strong><?php the_category(', ') ?></span>
    		</div>
    		<br clear="all" />
    	</div><!--post-arquivos-->
    
    <?php endforeach;
    include(TEMPLATEPATH . '/nav/paginavi-modelo.php'); ?>

    respondendo suas perguntas se não me engano o foreach não possui contadores e neste caso acho que só usando um for.

    Mas sinceramente meus conhecimentos de php são limitados e não posso te ajudar muito nesta questão.

    Não sei se o query_posts estando dentro do foreach vá fazer qualquer diferença porque não se está atribuindo nenhum valor a ele dentro do foreach, então ele sempre terá o mesmo valor creio eu.

    E em testes aqui eu até consegui limitar a quantidade, mas me retornou posts errados, então de certo modo acho que isso não está tendo muita influência no problema.

    Vale Lembrar que isso é pura suposição.

Visualizando 12 respostas - 1 até 12 (de um total de 12)
  • O tópico ‘Problema com paginação’ está fechado para novas respostas.