【问题标题】:Wordpress - Pagination post, order by: meta_key only from current categoryWordpress - 分页帖子,排序方式:meta_key 仅来自当前类别
【发布时间】:2015-10-10 17:33:05
【问题描述】:

我试图从我的网站制作分页链接。


架构:


Serie | (category)
    |_ Temporada 1 (taxonomy: temporada)
            |_ Episodio 1 (posts 1 - meta_key: numeroepisodio)
            |_ Episodio 2 (posts 2 - meta_key: numeroepisodio)
            |_ Episodio 3 (posts 3 - meta_key: numeroepisodio)
            |_ Episodio 4 (posts 4 - meta_key: numeroepisodio)
            |_ ...
    |_ Temporada 2  (taxonomy: temporada)
            |_ Episodio 1 (posts 1 - meta_key: numeroepisodio)
            |_ Episodio 2 (posts 2 - meta_key: numeroepisodio)
            |_ Episodio 3 (posts 3 - meta_key: numeroepisodio)
            |_ Episodio 4 (posts 4 - meta_key: numeroepisodio)
            |_ ...

Another Serie 1
    |_ ...
Another Serie 2
    |_ ...

问题:


当我创建帖子时,分页是按日期排序的。 可以帮我按 meta_key 进行此排序,在同一分类法中仅适用于当前类别吗?


代码:


<?php
    $prev_post = get_adjacent_post( true, '', true );
    $next_post = get_adjacent_post( true, '', false );

    if ( !is_a( $next_post , 'WP_Post' ) ) {
        $query_args = array (
        'post_type'         => 'post',
        'posts_per_page'    => -1,
        'meta_key'          => 'numeroepisodio',
        'orderby'           => 'meta_value meta_value_num',
        'order'             => 'DESC',
        'paged'             => $paged,
        'tax_query'         => array( 
                                array( 'taxonomy' => 'categry'),
                                array( 'taxonomy' => 'temporada') 
                        )
    );
        $oldest = get_posts($query_args);
        $next_post = $oldest[0];
    }
    if ( !is_a( $prev_post , 'WP_Post' ) ) {
        $latest = get_posts($query_args);
        $prev_post = $latest[0];
    }
?>
<?php if ( is_a( $prev_post , 'WP_Post' ) ) : ?>
<a href="<?php echo get_permalink( $prev_post->ID ); ?>"><div id="temporadas-dropdown"><i class="fa fa-caret-left"></i> ANTERIOR</div></a>
<?php endif; ?> 

<?php if ( is_a( $next_post , 'WP_Post' ) ) : ?>
<a href="<?php echo get_permalink( $next_post->ID ); ?>"><div id="temporadas-dropdown">SIGUIENTE <i class="fa fa-caret-right"></i></div></a>
<?php endif; ?> 

这是一个活生生的例子:http://series.enlatino.net/ver-online/silicon-valley/

非常感谢您的建议!

【问题讨论】:

  • 它在您的 tax_query 代码中显示类别
  • 已修复,但没有任何改变。还是谢谢你。

标签: php wordpress pagination


【解决方案1】:

我发现了这个:

<?php
/** Plugin Name: (#73190) Alter adjacent post link sort order */
function wpse73190_adjacent_post_sort( $orderby )
{
    return "ORDER BY p.menu_order DESC LIMIT 1";
}
add_filter( 'get_previous_post_sort', 'wpse73190_adjacent_post_sort' );
add_filter( 'get_next_post_sort', 'wpse73190_adjacent_post_sort' );

来自wordpress.stackexchange.com - 这将更好地解释它,所以检查一下......接受的答案,但基本上你可以使用该过滤器更改查询,并且有不同的过滤器 - where,join,sort for上一个和下一个。


完全不同的答案:

我并不是很喜欢手动操作,但这可能会奏效——虽然我没有对其进行测试,而且我对分类法和 wordpress 数据库的理解有些欠缺。

function get_adjacent_episode($post, $prev_or_next) {
    global $wpdb;
    
    $prev_or_next = ($prev_or_next === 'previous') ? 'DESC' : 'ASC';
    $operator = ($prev_or_next === 'previous') ? '<' : '>';
    
    $cur_episode = get_post_meta($post->ID, 'numeroepisodio', true);
    
    $query = sprintf("select p.ID from $wpdb->posts p 
        inner join $wpdb->postmeta m 
        on p.ID = m.post_id
        inner join $wpdb->terms_relationships r
        on p.ID = r.object_id
        where r.term_taxonomy_id = (select term_taxonomy_id from $wpdb->term_taxonomy where taxonomy = '%s' limit 1) 
        and p.post_type = 'post' and m.meta_key = '%s' and m.meta_value %s %s
        order by m.meta_key %s limit 1", 'temporada', 'numeroepisodio', $operator, $cur_episode, $prev_or_next);
        
    $adjacent_post = $wpdb->get_results($query);
    return $adjacent_post;
}

叫它:

$next_post = get_adjacent_episode($post, 'next');

$prev_post = get_adjacent_episode($post, 'previous');

请注意,查询只有select p.ID,因此您只能访问$next_post-&gt;ID,但如果需要,您可以扩展此选择以捕获更多结果。

【讨论】:

  • 嗨@amurrell,感谢您的回复。我对你的回答的问题是..这是一个好的做法?直接查询数据库安全吗?
  • 我鼓励您阅读wpdb object,特别是使用prepare 来避免sql 注入的想法,我已经使用sprintf() 完成了这一点。就个人而言,我认为操纵排序过滤器的另一种解决方案将是一种黑客工作,而且效率要低得多......常见做法? Idk,这是一种更手动的方法,也许这使它更先进 - 不确定。
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多