質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.71%

WordPressの固定ページにカテゴリ

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 994

jackie1993427

score 52

お世話になります。
WordPressを利用して商品の一覧サイトを作成しております。

実現したいこと

現在トップページに指定している固定ページに、商品一覧(カテゴリ)を表示させたい。

前提

GK Portfolioというテーマをベースに作成
こちらのサイトを参考に、表示させようと思いましたが、そもそも指定するphpを作成することができず...(phpに関しての知識がないため)

発生した問題

test.phpというファイルを作成し、

<?php
get_header(); ?>

    <div id="primary" class="content-area">
        <div id="content" class="site-content archive" role="main">

        <?php if (have_posts()) : ?>
            <header class="archive-header">
                <h1 class="archive-title"><?php printf( __('Category Archives: %s', 'portfolio'), '<strong>' . single_cat_title('', false) . '</strong>'); ?></h1>

                <?php if (category_description()) : ?>
                <div class="archive-meta"><?php echo category_description(); ?></div>
                <?php endif; ?>
            </header><!-- .archive-header -->

            <?php while (have_posts()) : the_post(); ?>
                <?php get_template_part('content-archive', get_post_format()); ?>
            <?php endwhile; ?>

        <?php else : ?>
            <?php get_template_part('content', 'none'); ?>
        <?php endif; ?>

        </div><!-- #content -->
        <?php portfolio_paging_nav(); ?>
    </div><!-- #primary -->

<?php get_footer(); ?>


を記述いたしました。

functions.phpに、

function Include_my_php($params = array()) {
    extract(shortcode_atts(array(
        'file' => 'default'
    ), $params));
    ob_start();
    include(get_theme_root() . '/' . get_template() . "/test.php");
    return ob_get_clean();
}

add_shortcode('myphp', 'Include_my_php');


という記述をし、
固定ページ側に[myphp file=’test’]を記述したところ、
トップページ内に「カテゴリが見つからない」旨のメッセージがループして延々と下まで
表示されている状態となりました。
そもそも指定するphpの内容が間違えているのではないかと思いますが、
知識が乏しいため、どのようにすればよいかわからず,,,

どなたかご教示いただけないでしょうか。
説明が不足しているようでしたらご指摘ください。追記いたします。

何卒よろしくお願い申し上げます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/09/13 19:25

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • kuck1u

    2016/09/13 19:49

    上記のソースコードはバッドノウハウなので、いますぐに利用を中止されることをオススメします。

    キャンセル

回答 2

+3

以下は、指定カテゴリーの記事一覧を表示させるショートコードを実装するソースコードです。これは、私がよく使うショートコードです。

簡単な説明をソースコード表示の下に記述しているのでお読みください。

 特定カテゴリーの記事一覧を表示するソースコード

function kuck1u_47888_shortcode_post( $atts ) {
    $atts = shortcode_atts( array(
        'cat'      => null,
        'cat_name' => null,
    ), $atts, 'postlist' );
    $args = array(
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'nopaging'       => true,
        'posts_per_page' => '-1',
    );
    $output = array();

    if ( isset( $atts['cat'] ) && ! empty( $atts['cat'] ) ) {
        $args['cat'] = preg_replace( '/[^0-9,]/', '', $atts['cat'] );
    }

    if ( isset( $atts['cat_name'] ) && ! empty( $atts['cat_name'] ) ) {
        $args['category_name'] = preg_replace( '/[^\w\-,]/', '', $atts['cat_name'] );
    }

    if ( isset( $atts['cat'] ) && isset( $atts['cat_name'] ) ) {
        unset( $args['cat'] );
    }

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            ob_start();
            get_template_part( 'content', 'archive' );
            $output[] = trim( ob_get_contents() );
            ob_end_clean();
        }
    }

    wp_reset_postdata();

    return implode( PHP_EOL, $output );
}
add_shortcode( 'postlist', 'kuck1u_47888_shortcode_post' );

 使い方

固定ページにショートコードを記述します。例えば、カテゴリーID: 996の記事一覧を表示したい場合は以下のようになります。

[postlist cat="996"]

カテゴリーIDが分からない!ということはよくあることなので、カテゴリースラッグでも指定可能です。

[postlist cat_name="wordpress"]

複数のカテゴリーを指定したい場合は、カンマ区切りで指定します。

[postlist cat="996,966"]
[postlist cat_name="wordpress,teratail"]

 表示のカスタマイズ

表示のカスタマイズは、ソースコードのget_template_part( 'content', 'archive' );の部分で行えます。初期では、テーマディレクトリ内のcontent-archive.phpが呼び出されるようになっています。例えば、get_template_part( 'content', 'teratail' );に変更した場合は、テーマディレクトリ内のcontent-teratail.phpが呼び出されるようになります。

content-XXXXX.phpを作成する注意点として、get_header()関数、get_footer()関数、get_sidebar()関数は不要です。

 その他のカスタマイズ

記事の呼び出しは、WP_Queryを使用しているだけなので、$args変数の部分を変更すれば、好きに変えられます。例えばタームを表示することも、表示件数を変更することも可能です。

 パフォーマンスについて

パフォーマンスが気になる場合は、Transient APIを組み合わせるといい感じになると思います。上記のソースコードでは記述していませんが、実際の案件ではよく利用します。

上記のソースコードの場合、returnの前で$output変数の内容をTransient APIで30m〜1hほどキャッシュさせると、だいぶ負荷も軽減されると思います。もっと踏み込む場合、24hキャッシュとかにして、記事が更新されたタイミングでキャッシュをクリアする処理を入れるとかするといいと思います(私は面倒なのでそこまでしませんが)。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/14 19:46

    すみません、そもそもの基礎知識が足りないようで、

    >記事の呼び出しは、WP_Queryを使用しているだけなので、$args変数の部分を変更すれば、好きに変えられます。例えばタームを表示することも、表示件数を変更することも可能です。

    の部分読ませていただきましたが、表示方法や件数のみ変更できるものだと思っておりました。
    調べつつ、いただいたものを参考に進めていきます。

    キャンセル

  • 2016/09/14 21:20

    WP_QueryはWordPressの心臓部分なので、WP_Queryを扱えるようにならないと、WordPressのカスタマイズは結構厳しいです。ただ、WP_Queryが使えるようになってしまえば、あとはPHPの知識なのでどうとでもなる感じです。頑張ってください!

    キャンセル

  • 2016/09/20 11:22

    度々申しわけありません。もう少々お力添えいただけたらと思います。

    function kuck1u_47888_shortcode_post( $atts ) {
    $atts = shortcode_atts( array(
    'cat' => null,
    'cat_name' => null,
    ), $atts, 'postlist' );
    $args = array(
    'taxonomy' => 'product_category',
    'field' => 'slug',
    'terms' => 't-shirt',
    );
    $output = array();

    if ( isset( $atts['cat'] ) && ! empty( $atts['cat'] ) ) {
    $args['cat'] = preg_replace( '/[^0-9,]/', '', $atts['cat'] );
    }

    if ( isset( $atts['cat_name'] ) && ! empty( $atts['cat_name'] ) ) {
    $args['category_name'] = preg_replace( '/[^\w\-,]/', '', $atts['cat_name'] );
    }

    if ( isset( $atts['cat'] ) && isset( $atts['cat_name'] ) ) {
    unset( $args['cat'] );
    }

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
    $query->the_post();
    ob_start();
    get_template_part( 'content', 'archive' );
    $output[] = trim( ob_get_contents() );
    ob_end_clean();
    }
    }

    wp_reset_postdata();

    return implode( PHP_EOL, $output );
    }
    add_shortcode( 'postlist', 'kuck1u_47888_shortcode_post' );

    という感じに$argsの部分変更いたしました。
    こちら、(https://wpdocs.osdn.jp/関数リファレンス/WP_Query)を参考に変更してみましたが、間違えておりますでしょうか。
    いただいたものでfunctions.phpに追記すると部分的に表示されますが、こちらですと全く反応がなく...
    恐縮ですがご教示いただけますでしょうか。

    キャンセル

0

こちらのブログ記事を参考にしてみてはいかがでしょうか。

WordPressでトップページに固定ページと投稿ページを表示する | RuputerFan
http://sygnas.jp/2010/10/19/frontfix/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/13 19:49

    あ、既にやりかけのコードがあったんですね。失礼しました……

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.71%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる