wordpressの一覧ページでmoreタグで省略したくないとき。

やりたいこと

WordPress 3.7の一覧ページでmoreを無視して全文出力したい。

具体的には、

if(ログインしているか?):
//してます!
全文を表示
else:
//してません!
more以前を表示
endif;

というようなこと。

それを、

<?php include TEMPLATEPATH.'/more_content.php'; ?>

や、get_template_partで全テンプレート共通の処理として読み込もうとしていた。

イレギュラーな使い方なのは承知の上。

問題とか原因とか

index.phpやアーカイブの一覧表示では、


the_content('',false,'');

としても全文表示されず、moreタグがリンクに変換される。

WordPress Codex : the_excerpt の曰く

the_excerpt() と the_content()

敢えてthe_content() 関数を使うことに意味がある場合があります。 それはこの関数が、投稿本文内に <!--more--> タグが使用されているかどうかによって表示内容が変わるためです。<!--more--> タグは、挿入した位置で本文を2つに分けます。メインブログページやアーカイブといったリスト形式のページではこのタグより前の部分のみを表示します。個別投稿/ページでは(もちろん) <!--more--> タグが無視され、本文全てを表示します。

the_content()/get_the_content()を通すと一覧ページではmoreがリンクに変換済みの本文が返ってきて、シングルページでは素の本文が返ってくる。

そのため、[解決済み] single.phpでmoreの前後を別々に表示したい の2レス目のように切り分けたくても、一覧ページではmoreタグ以降は取得できない。

ではどうするか

echo apply_filters('the_content', $post->post_content);

なにがどうあっても、echo $post->post_content;はしたくなかった。ショートコード無視されるし。
フィルター通したら同じ事なのでは?と思っていましたが、あっさりできてしまった。

参考サイト

本当は怖い WordPress – echo $post->post_content; を避ける3つの理由

WordPressのメディアアップローダー

WordPress3.5.1のメディアアップローダーでハマりかけてます。

ブラウザによりそうですが、80KB程度の画像300枚くらいまとめて上げようとすると挙動不審に。

使い方として、推奨されてないだろうことは重々承知の上で、なんとかまとめてアップロードしたいのだけど、40枚くらいが限界の模様。

さらに、アップロードが非同期だからデータベースに書き込まれる順序がバラバラになってしまう。

昔のバージョンのアップローダは、順序よく上がってくれたし、タイムアウトしても続きから送れば良かったので、大量に写真を送りつけても安心でした。

そのため、画像と1:1で結びつける投稿があっても、Excel+VBAで作ったデータとジェネレータを使ってWordPress形式インポート、というのが可能だったのです。

試してみたところ、少しずつ上げるとアップロード処理自体は行われるけれども、今度は順序の乱れが取り返しつかないレベルなりました。

枚数が少なければ、並び替えもしやすいインターフェイスなのですが…。

プラグイン使うとなると大抵表示側だと思うんですが、ギャラリー(表示)はデフォルトでもかまわないのに、今回はアップロードで難儀してます。

ファイルはFTPでアップロードして、ポチッとな→ファイル名降順でメディアギャラリーに差し込むWordPressプラグインとかないかな!

…プラグインではありませんが、昔だいたい同じようなもの作ったはずなので、発掘するのと新しく作るのだったらどちらが早いかで悩ましい夜明け。

今回はDropboxのWeb表示URL貼ってごまかすという手もあるので、どうしようか。

WordPressショートコードで投稿データ表示。

テンプレート面倒くさくていじりたくない…。
新しいテンプレート作るときコピペするの面倒だもの…。

そこで、今更感抜群のこちら!

ショートコード内でテンプレートと同じ記事のループ処理をしてるので、
投稿内容がthe_content()とかdo_shortcode(get_the_content())を通ると記事が表示できます。

使い方としては、Magic Fields2プラグインでpost_typeとcustom_taxonomyいっぱい作って、
管理画面の編集できる範囲を固定化した後に、ページの本文でこのショートコードを呼び出して
一部の必要な記事を表示する。

ショートコード外の装飾はビジュアルエディタである程度いじれるのがメリット。

[show_posts post_type="posts" length="1"]

とかで管理画面から特定ポストタイプの最新の投稿1件を出せます。
あと、taxonomyも1個だけ対応している。
(ある固定ページにポストタイプ「event」の「交流会」タクソノミーの最新1件だけを表示したいときとかに)

[show_posts post_type="posts" taxonomy="post-tax"]

中ではWP_Queryでテンプレートに書くループやってるだけなので、後はスタイルシートで頑張る。

あと、ページ送りとか使わないような1件抽出とか向きです。そのへんまったく考慮してません。

あっ、中でloopテンプレート呼んだりしたほうがいいのかな?

<?php
function shortcode_show_posts($atts, $content = null){
 $result="";
//ショートコードで使えるオプションたち
 extract(shortcode_atts(array(
 'post_type'=>'',//ポストタイプ
 'post_id'=>'',//ポストID
 'length'=>1,//=posts_per_pages、記事数
 'taxonomy'=>'',//タクソノミー
 'order'=>'date',//ソート基準
 'orderby'=>'DESC',//ソート順
 'show_post_title'=>1,//タイトル表示するか?
 'show_post_date'=>1,//日付表示するか?
 'show_post_body'=>1,//本文表示するか?
 'use_link'=>0,//タイトルにパーマリンクするか?
 'title_class' => '',//タイトルに追加CSSクラス
 'body_class' => ''),//本文に追加CSSクラス
 $atts));

//WP_Queryに渡すオプションを整理
 if(!empty($taxonomy)){
//taxonomyがあるときは大体他の条件無視する。
 $opt=array(
 'tax_query'=>array(array('taxonomy'=>$post_type.'s', field=>'slug', terms=>array($taxonomy))),
 'posts_per_page'=>$length,
 'order'=>$order,
 'orderby'=>$orderby,
 'post_status' => 'publish'
 );
 }else{
 $opt=array(
 'post_type' => $post_type,
 'p'=>$post_id,
 'posts_per_page'=>$length,
 'order'=>$order,
 'orderby'=>$orderby,
 'post_status' => 'publish'
 );
 }

 $query = new WP_Query($opt);

 if($query->have_posts()):while($query->have_posts()):
 $result.='<div>';
 $query->the_post();

 if($show_post_title){
 $result.='<h3>';
 if($use_link){
 $result.='<a href="'.get_permalink().'">'.get_the_title().'</a>';
 }else{
 $result.=get_the_title();
 }
 $result.='</h3>';
 }

 if($show_post_date){
 $result.='<date>';
 $result.=get_the_date('Y年m月d日 H:i 掲載');
 $result.='</date>';
 }

 if($show_post_body){
 $result.='<div>';
 $content=do_shortcode(get_the_content());
 $result.=str_replace("\n","<br />",$content);
 }

 $result.='</div>';
 $result.='</div>';
 endwhile;endif;

 return $result;
}
add_shortcode("show_posts", "shortcode_show_posts");
?>

WordPress投稿時にTwitterでつぶやくには。

WP to Twitterプラグインを使います。

  1. 管理画面の「プラグイン」メニューから、「新規追加」→「WP to Twitter」を検索でインストール。
  2. インストール後は、自分のWordpress(に入れたWP to Twitter)をTwitterクライアントとして登録しなければいけないようで、まずはTwitterの開発者向けサイトへ。
  3. 画面に従って登録。
  4. 登録が完了して、現在の設定内容などが表示されるページ(detailsタブ)が表示されたら、Access tokenなどをコピーする前に、「Settingsタブ」からApplication TypeRead and Writeに変更しましょう。
    また、この操作を行う時間帯などのタイミングもあると思いますが、設定を送信しても反映されないことがあるので、きちんと確認画面に表示されるまで何度か根気よくやります。
  5. 「Detailsタブ」でRead and Writeになっているかを確認してから、必要事項をコピペ&設定し、WP to Twitter管理画面の一番下までスクロールしてテストボタンをクリックして、動作確認します。

 

Twitterへ投稿する際には、カテゴリのスラッグに日本語が含まれているとうまくリンクされなかったりしますので、その辺も確認するといいかも。

「このカテゴリは投稿する」のチェックがついていると、チェックがついていないカテゴリは投稿されません。

…「このカテゴリは投稿しない」と間違いやすいので…(間違えた人←