如何根据插件查询页面/帖子?

时间:2020-06-16 作者:silviubogan

我在一个包含英文和罗马尼亚文的博客上工作。

我通过在每篇文章的slug前面加上ro和en,使该网站成为双语网站。这是一种简单的方法,效果很好。

现在,我必须创建一个自定义归档文件,该文件在给定的月份显示,并分页,只显示具有分别以ro或en开头的slug(page\\u名称)的文章。

我想我应该制作两个PHP文件,一个叫做en-archive。php和其他称为ro归档的文件。php,这是我想我会尝试的,但我不知道如何进行查询,以便正确显示分页。

此外,在此更改后,正确的替换方法是什么:?

<ul class=\'archives-list\'><?php wp_get_archives() ?></ul>
谢谢你。

更新我没有尝试接受的答案,因为我开始使用插件(Polylang),但对于社区,我接受了它(它看起来很好,而且很详细)。

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

使用自定义页面(post类型page) 和acustom Page Template, 您可以这样做:

在模板中,创建WP_Query 用于查询罗马尼亚语或英语的帖子。

查询/函数参数中的WP_Querywp_get_archives(), 使用名为lang 定义语言slug-ro 对于罗马尼亚人,en 对于英语-用于仅包括帖子或具有帖子开头的文档<language slug>-, e、 g。ro-.

代码

The custom Page template:

请注意,我对罗马尼亚语和英语版本使用了相同的代码,除了lang 当然设置为相应的语言slug。如果需要,可以使用自定义元数据(例如。_lang) <对于页面,只需使用一个模板即可使用所有语言,但您需要自己实现。

所以在我的测试站点上,我有以下页面:

RO存档(/ro-archive/) 使用template-ro-archive.php 样板

电子存档(/en-archive/) 使用template-en-archive.php 样板

<?php
// I\'m only including the main content, but make sure your template contains
// the Template Name header and the calls to get_header() and get_footer().
?>
<ul>
    <?php wp_get_archives( [
        \'lang\' => \'ro\',
    ] ); ?>
</ul>

<?php
$paged = max( 1, get_query_var( \'paged\' ) );

// Query the posts.
$query = new WP_Query( [
    \'lang\'           => \'ro\',
    \'paged\'          => $paged,
    \'posts_per_page\' => 10,
] );

// Display the loop.
while ( $query->have_posts() ) :
    $query->the_post();
    // .. your code here.
endwhile;

// And a pagination.
echo paginate_links( [
    \'current\' => $paged,
    \'total\'   => $query->max_num_pages,
] );

// Lastly, restore the global $post variable.
wp_reset_postdata();
?>
实际上,你也可以制作模板specific to the respective Page, e、 g.使用名称page-ro-archive.php 而不是template-ro-archive.php.

  • The query filter for WP_Query, using the posts_where hook:

    <这个代码应该放在主题的函数文件中

    // Include only the posts where the slug begins with <language-slug>- like ro-
    add_filter( \'posts_where\', function ( $where, $query ) {
        if ( ! is_admin() && $lang = $query->get( \'lang\' ) ) {
            global $wpdb;
            $where .= $wpdb->prepare(
                " AND {$wpdb->posts}.post_name LIKE %s",
                $lang . \'-%\'
            );
        }
    
        return $where;
    }, 10, 2 );
    
  • The query filter for wp_get_archives(), using the getarchives_where hook:

    <这个代码应该放在主题的函数文件中

    // Include only archives having posts where the slug begins with
    // <language-slug>- like ro-
    add_filter( \'getarchives_where\', function ( $where, $parsed_args ) {
        if ( ! is_admin() && ! empty( $parsed_args[\'lang\'] ) ) {
            global $wpdb;
            $where .= $wpdb->prepare(
                " AND post_name LIKE %s",
                $parsed_args[\'lang\'] . \'-%\'
            );
        }
    
        return $where;
    }, 10, 2 );
    
    1. 替代解决方案

      使用自定义分类法,例如。lang, 用于您的文章/帖子。这样,你就可以得到条件ro (罗马尼亚)和en (英语),那么您将在/lang/ro/lang/en. 而且,您可以有一个单一的标准模板(即。taxonomy-lang.php) 对于那些档案。

      但是

      您需要将所有文章分配给正确的lang 期限lang 参数/过滤器wp_get_archives().

    相关推荐

    是否使用插件覆盖主题中的WooCommerce loop-start.php?

    “我的主题”有一个覆盖内容/主题/主题名/woocommerce/循环/loop-start.php.我想使用插件覆盖此文件。我知道可以使用子主题来完成,但我想使用插件(因为我在1个插件中捆绑了许多其他修改)。我在堆栈交换上发现了其他一些类似的问题,但无法找到有效的解决方案。以下是我的尝试:使用theme_file_path:add_filter( \'theme_file_path\', \'override_woocommerce_loop_template\', 9999); fu