もうひとつ原因になりそうな箇所がありました。
ヘッダー、左サイドバー、コンテンツ、右サイドバー
という順番でウェブサイトは表示されています。
左サイドバーの中で特定のカテゴリの昨日から90日後までの記事のタイトルを表示させるため、次のように書いています。
未来日時の設定の投稿は表示されるようにしてあります。
<?php function filter_where($where = '') {
$where .= " AND post_date >= '" . date('Y-m-d', strtotime('-1 days')) . "'" . " AND post_date <= '" . date('Y-m-d', strtotime('+90 days')) . "'";
return $where;
}
add_filter('posts_where', 'filter_where');
query_posts("numberposts=10&cat=3&order=ASC"); ?>
<?php if(have_posts()):while(have_posts()):the_post(); ?>
<a href="<?php the_permalink() ?>"><?php the_title(); ?><br /></a>
<?php endwhile; endif; ?>
<?php wp_reset_query(); ?>
これも原因のひとつでしょうか。
記事内でPHPをExec-PHPで動かしています
ショートコードを使用してみてはいかがでしょうか。
記事内でphpを使用する方法及びそのプラグインの使用はセキュリティを落とすと言われています。まあ、ショートコードの方が見た目にもきれいですしね!
ご教授、ありがとうございます。
ショートコードで目的のリンク、特定のカテゴリかつ特定のタグの作成はできました。
function linktoalllive_func($atts, $content = null) {
extract(shortcode_atts(array(
"dcat" => '',
"dnen" => '',
"dtag" => ''
), $atts));
query_posts("year=$dnen&monthnum=$dcat&cat=3&tag='.$dtag");
$retour='
<ul>';
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
$retour.='
<a href="'.get_permalink().'">'.the_title("","",false).'</a>
';
endwhile;
$retour.='</ul>
';
else:
$touroku='<a href="http://solo-guitar.info/regist_schedule/">登録する</a>';
return "スケジュールはまだ登録されていません $touroku.";
endif;
wp_reset_query();
return $retour.$content ;
}
add_shortcode( 'linktoalllive', 'linktoalllive_func' );
このようにしました。
ところが、当初の問題はまだ解決できません。
記事
A 1月に投稿 カテゴリ X
B 2月に投稿 カテゴリ X
C 3月に投稿 カテゴリ X
D 4月に投稿 カテゴリ X
E 5月に投稿 カテゴリ Y タグ Z
カテゴリXにアクセスした場合、
query_posts(“posts_per_page=10&cat=X&order=ASC”);
として
A
B
C
D
というふうに表示します。これは問題ありません。
ところが記事Bから記事Eへのリンクをショートコードを使用して挿入すると、
A
B
D
C
B
A
といったような並び順になってしまい、
ショートコードでリンクを張ったところ以降は当初の並び順を無視してしまいます。
ショートコード中の
query_posts
が何か影響を与えているのでしょうか。
wp_reset_query();
をはずしてみても思い通りの並び順は実現できませんでした。
どなたか何かいい方法がありましたら
ご教授ください。
お願いいたします。
query_posts
でループを制御するのではなくて、get posts
でループを取得してから配置するとかではだめなんでしょうか。まあ、
query_posts 関数はメインの WordPress ループだけを変更するためのものです。新たなループを作るためのものではありません。メインループの他にループが必要な場合は、別の WP_Query オブジェクトを作ってください。メインループの他で query_posts を使用すると、メインループが不正な状態になり期待する結果が得られません。
query_posts 関数はページのメインクエリを上書きし、置き換えます。他の目的で使用してはいけません。
とも書かれていますし・・・カテゴリーリンクを作るためだけなら他の方法を模索した方が早い気がしますね;)
ありがとうございます。
おっしゃるように、get postsで取得で配置で、
記事の順序の問題は解決しました。
function sc_liste($atts, $content = null) {
extract(shortcode_atts(array(
"num" => '5',
"tag" => '',
"cat" => ''
), $atts));
global $post;
$myposts = get_posts("tag='.$tag&category=$cat");
$retour='
<ul>';
foreach($myposts as $post) :
setup_postdata($post);
$retour.='
<li><a href="'.get_permalink().'">'.the_title("","",false).'</a></li>
';
endforeach;
$retour.='</ul>
';
return $retour;
}
add_shortcode("list", "sc_liste");
このコードに
if()
else
を入れて、
記事内でたとえばショートコードで
[list tag=”z” cat=”A”]
とした場合に、
この記事が存在する場合は、リンクを表示。
存在しない場合は、
「存在しません」
というように表示したいのですが、
いろいろ試しているのですが出来ずにいます。
どこにどうやってどのような条件を使って
if()
else
を入れればいいのかがわかりません。
何度も質問してすみませんが、ご教授お願いいたします。
リストを作る前に条件を入れればよさそうです。
たとえば
if(count($myposts)){
foreach($myposts as $post) :
setup_postdata($post);
$retour.='<li><a href="'.get_permalink().'">'.the_title("","",false).'</a></li>';
endforeach;
$retour.='</ul> ';
}else{
$retour = '存在しません';
}
return $retour;
のような感じで。
できました!
ありがとうございます。
おかげさまで予定していた仕組みのウェブサイトが出来そうです!
本当にありがとうございます!