使用Pagenavi分页的自定义查询(作者是POST_AUTHER或META CONTAIR_AUTHER)

时间:2012-12-18 作者:Copons

我需要为作者存档创建一个自定义查询(其中作者是post\\u作者或meta co\\u作者),它必须与WP Pagenavi一起使用。

查询如下(为了清楚起见,省略$wpdb和常用子句):

SELECT posts.*
FROM posts, postmeta
WHERE
    posts.ID = postmeta.post_id AND
    (posts.post_author = $author OR
        (postmeta.meta_key = \'co_author\' AND
         postmeta.meta_value = $author)
    )
我已经尝试过了,但没有成功:

使用限制和偏移query_var($paged)\'posts_per_page\' 选项,但Pagenavi总页面数与查询时的默认作者存档页面数相同\' OR posts.post_author = $author\') 只检查meta\\u键/值的自定义WP\\u查询,但Pagenavi完全忽略过滤器实际的问题是,我无法仅使用WP\\u查询参数数组来检查“meta\\u query或post\\u author”,例如:

$the_query = new WP_Query(array(
    \'post_author\'    => $author,
    /* OR */
    \'meta_query\'     => array(
        array(
            \'key\'    => \'co_author\',
            \'value\'  => $author
        )
    )
));
不幸的是,我对查询过滤器不是很有信心,所以我真的很想找到一个简单的解决方法,使其与Pagenavi一起工作。但是,在这个问题上花了很多时间后,我的头脑已经不新鲜了,我不知道如何继续。

提前谢谢大家。

1 个回复
最合适的回答,由SO网友:Copons 整理而成

好吧,我想我找到了一些真正有用的东西,我正在发布它,以防有人需要它。

解决方案只是避免仅为此页面使用Pagenavi,使用paginate_links() 取而代之的是,迫使它或多或少地表现得像Pagenavi,以保持整个网站的一致性。

让我解释一下。

我的自定义查询现在如下所示:

$query = "
SELECT $wpdb->posts.*
FROM $wpdb->posts, $wpdb->postmeta
WHERE
    $wpdb->posts.ID = $wpdb->postmeta.post_id
    AND $wpdb->posts.post_status = \'publish\'
    AND $wpdb->posts.post_type = \'post\'
    AND $wpdb->posts.post_date <= NOW()
    AND (
        $wpdb->posts.post_author = $curauth->ID
        OR (
            $wpdb->postmeta.meta_key = \'co_author\'
            AND $wpdb->postmeta.meta_value = $curauth->ID
        )
    )
GROUP BY $wpdb->posts.ID
ORDER BY $wpdb->posts.post_date DESC
";
然后,我为分页创建了一些有用的变量:

global $wpdb;
global $post;

$total_query = "SELECT COUNT(*) FROM ($query) AS combined_table";
// Total count of rows
$total = $wpdb->get_var($total_query);

// Number of rows per page, as set in Wordpress settings
$items_per_page = get_option(\'posts_per_page\');

// Current page; defaults to 1 if not requested
$page = isset($_GET[\'page\']) ? abs((int) $_GET[\'page\']) : 1;

// Offset for query LIMIT
$offset = ($page*$items_per_page) - $items_per_page;

// Well... the next one is pretty much self-explained...
$last_page = ceil($total/$items_per_page);
然后执行查询并构建循环:

$posts = $wpdb->get_results($query." LIMIT $offset, $items_per_page");

foreach ($posts as $post) :
    setup_postdata($post);
    // The Loop
endforeach;
最后,分页(请注意,我使用的是paginate_links() / wp_pagenavi() 要设置样式的类):

// Echo "Page # of #"
echo \'<span class="pages">Page \'.$page.\' of \'.$last_page.\'</span>\';

// If this isn\'t the first page...
if ($page != 1)
    echo \'<a class="page-numbers" href="\'.$base_url.\'">&lt; FIRST</a>\';

// I don\'t really know how to explain this one because I found it somewhere I can\'t find again, but it works!
echo paginate_links(
    \'base\'        => add_query_arg(\'page\', \'%#%\'),
    \'prev_text\'   => \'&lt;\',
    \'next_text\'   => \'&gt;\',
    \'total\'       => $last_page
    \'current\'     => $page
);

// If this isn\'t the last page...
if ($page != $last_page)
    echo \'<a class="page-numbers" href="\'.$base_url.\'?page=\'.$last_page.\'">LAST &gt;</a>\';
正如你可能已经注意到的,有一个$base_url 变量:这是我唯一的警告。首先,这是$base_url:

$current_url = $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
$current_url = explode(\'?\', $current_url);
$base_url = \'http://\'.$current_url[0];
警告是我不能paginate_links() 要回显重写的URL,既不知道如何为第一页和最后一页链接生成URL。所以现在这个归档文件中的URL类似于http://www.example.com/author/username/?page=2 而不是http://www.example.com/author/username/page/2/

就是这样。我希望有人会觉得这很有用!

结束

相关推荐

Using WPDB class

我想使用wpdb 我的外部页面上的类与wordpress没有关联。我尝试在php文件中包含以下内容:// include wordpress functions include( $_SERVER[\'DOCUMENT_ROOT\'] . \'/wp-load.php\'); require_wp_db(); global $wpdb; 现在,我使用$wpdb->query$product_info_query = $wpdb->query(\"select