web-dev-qa-db-ja.com

上の各カテゴリのアーカイブ WP マルチサイト

私はクライアントのための多言語サイトに取り組んでいます。これを行う最も簡単な方法は(無料で)WordPress Multisite Language Switcher( http://lloc.de/msls )を使用することでした。私はしばらくこのサイトに取り組んできました、そしてそれはうまくいっています。

クライアントがさまざまなページをリストページとして設定できるようにするために、汎用テンプレートを含める必要がありました。タイトルに基づいてカテゴリIDを取得することによってこれを行います。ここから、そのカテゴリの関連記事を一覧表示します。ここまでは順調ですね。

ページの上部に、そのカテゴリのアーカイブの年ドロップダウンを含めます。これは相談なしで設計の初期に含まれていました、そして、クライアントは彼らが適所にこれを望んでいると断言しています。

私は以前に 'kwebble'( http://kwebble.com/projects/wp-plugin-afac )というプラグインを使用しましたが、サポートされなくなりましたが、うまく機能し、多くの問題を解決し、間違いなく標準の単一サイトインストールで機能します。

私の問題は、私のアーカイブページで、Originのカテゴリに関連するカテゴリを検出する必要があることです。私はページにカテゴリを出力しようとしました、そして、それは韻または理由を作りません。 2014年を選択した場合、カテゴリは1つになります(現在とは無関係)。 2013年を選択した場合、別のカテゴリが表示されます(これも無関係です)。その間、これらのアーカイブページはURLの下にあります:domain.com/blog/2014等私はそれがURLの/ blog /なしではたらくようにそれを得ることができないようです。

どうやって続けるかについては完全に迷っています。残念ながら、私はそのサイトをクライアントのプライバシーが保護されているので見せられないが、もしそれが助けになれば私はどんなコードのサンプルも与えることができる。

どんな助けでも大いに感謝されるでしょう。

1
tadywankenobi

どうやってこれを解決したのか教えてください。

同僚との話し合いの後、URLに末尾の年を付け加えても、表示されるページには影響がないことを彼は指摘しました(私はまだこの理由を見つける時間がありません)。

/ category/subcat/2011 /

と同じページを表示します。

/ category/subcat /

これは、私がURLを解析し、それから1年を取ってそれをクエリに追加できることを意味しました。

これをヘッダーに追加してURLを解析しました(もっと効率的な方法があると思いますが、これは私にとってはうまくいきました)。

$current = $_SERVER['REQUEST_URI']; // get the url

$parts = explode('/',$current); // break the url down into parts
$parts = array_slice($parts, 1, -1); // for some reason, first and last array items were blank, so trim them

$pattern = "/\d{4}/"; // set the pattern to match a 4 digit number
$last = end($parts); // get the last item in the array
$year = ''; // set the year variable to be empty

if(preg_match($pattern, $last)) {  // test the last array item against the 4 digit pattern
    $year = $last; // if it is a number, then set the year variable to that value
    $parent_parts = array_slice($parts, 0, -1); // as I need this to work with both the url having a number at the end and on the parent page too (without a year in the URL), make the parent part path by trimming out the year component

    $parent = implode('/',$parent_parts); // remake the url parts
    $parent = '/'.$parent.'/';  // add leading and trailing slashes
} else {
    $parent = $current;  // if the test doesn't find a year, just set the parent to the REQUEST_URI
}

これはそれがすることのために過度に複雑に思えるかもしれません、しかし論理はうまくいきます。私が1年間テストをするならば:

/ category/subcat /

このビットをどうするかを知るためのコードが必要です。 URLが次の場合、URLのこの部分が常に必要になります。

/ category/subcat/2011 /

私はそれから2011年を切り取る必要があるでしょう。これはさらに明らかになります。

タイトルの表示を次のように変更しました。

<h2><?php the_title(); ?></h2>

に:

<h2><?php echo get_the_title();
if($year !== ''){
    echo ': Archives '.$year;
}
?></h2>

つまり、親ページにタイトルを出力し、1年のサブページに「:Archives 2011」を追加して、適切なアーカイブのように見せることができます。

私はそのページの一番上にその年のドロップダウンを持っています。以前はこれにwp_get_archivesが取り込まれていましたが、今は廃棄しました。今、私は最初の "All"というアイテムを持っている必要があります。これは、親の投稿リストの完全なリストに戻り、それ以降の各アイテムは1年になります。

<select name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;"> // standard wp_get_archives dropdown jump functionality
        <option value="<?php echo get_bloginfo('url'); ?><?php echo $parent; ?>">All</option> // the "All" option, with the parts formulating the url
        <?php
        $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts ORDER BY post_date DESC"); // getting a list of years for all the posts in the category
        foreach($years as $list_year) : 
        if($list_year == $year) {
            $select = ' selected="selected"'; // ensures that the current year stays selected
        } else {
            $select = '';
        } ?>

        <option value="<?php echo get_bloginfo('url'); ?><?php echo $parent; ?><?php echo $list_year; ?>/"<?php echo $select; ?>><?php echo $list_year; ?></option> // populates the option field
        <?php endforeach; ?>
</select>

とてもわかりやすいものです。ドロップダウンコードの大部分は、 http://wordpress.org/support/topic/archives-by-year-this-is-different から入手できます。

私はおそらくMySQLクエリにカテゴリコンポーネントを追加する必要があります。

最後に、WP_Queryをyear属性を含めるように変更しました。親ページが選択されているときは空白になっているため、デフォルトで最新の日付になります。それ以外の場合は、選択された年だけが表示されます。

$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : false;
$args = array('cat' => $cat, 'posts_per_page' => '10', 'paged' => $paged, 'year' => $year );
$query = new WP_Query($args);

念のため、wp_pagenaviプラグインで使用するページングを残しました。

ここでの教訓は、WordPress Multisiteアーカイブが驚くべきことです。 DIYはずっといいです。これが他の誰かに役立つことを願っています。

更新:この点に関してページネーションに関する大きな問題が発生しました。解決策に取り組んでいますが、これを回避する簡単な方法はないようです。 WordPressは、カテゴリ固有のアーカイブや改ページではうまく動作しないようです。

1
tadywankenobi