カスタム投稿タイプを、任意に複数、選択してRSSに反映させる

カスタム投稿タイプのフィードを個別に選択して表示したいとき。

たとえば、このサイトは、

「通常の投稿」の他に、カスタム投稿タイプを使って、「製作実績」や「トップのスライド」を管理しています。

「通常の投稿」と「製作実績」のRSSは取得したいけど、「スライド」は取得したくない場合など、フィードを取得するURLのパラメーターで管理できれば楽かも。

 

ということで、ちょっと考えてみた。

コード

function.phpに追加するコード

function my_feed_request($vars) {
 if ( isset($vars['feed']) && !isset($vars['post_type']) ){
 $my_feed_post_type = $_GET['post_type'];
 $my_feed_post_type_array = explode(",",$my_feed_post_type);
 $vars['post_type'] = $my_feed_post_type_array;
 }
 return $vars;
}
add_filter( 'request', 'my_feed_request' );

 

使用方法

通常のRSS取得のURL

  •  https://croquis.jp/wp_croquis/?feed=rss2&post_type=post

カスタム投稿タイプを、任意に複数、選択してRSSを取得するURL

  • https://croquis.jp/wp_croquis/?feed=rss2&post_type=post,works

取得したいカスタム投稿タイプのスラッグをカンマ区切りで追加していく

 

 

‘post_type’のパラメーターを使わずに、’my_post_type’とかの独自変数を使った方がいいかもしれないし、パラメーターの存在確認も必要かもしれないけど・・・

 

WordPressはGPL

 

便利に活用させてもらっている

 TinyMCE Clear

というプラグインがエラーをはいていたので修正したいと思い、ライセンスについて調べていたら、WordPress本体に関する興味深い記事を発見。

WP−D http://wp-d.org/2012/11/07/1046/

WordPressはGPLライセンスです・・・と。

GPLライセンスで頒布されているプログラムは、それを受け取った者が、修正を加えてもいいし、他のプログラムに組み込んでもいいし、自由に改変できる。ただ、それを再頒布する場合は、それを受け取った者も同じように自由に改変できる権利を持つということ。

 

WordPressを使ってたくさんのサイトを制作していますが、基本的には、WordPress本体や、プラグイン改変していません。それは、アップデートの対応が大変だから。でも、開発が終わっているようなプラグインで使い勝手の良いモノは、修正やカスタマイズして使っています。

ご要望があれば、再頒布も可能なので、ご相談ください。

 

で、このプラグインのエラーの原因は、簡単に直るんですけどね。

 

WordPress「画像の編集」のエラーについて ≪解決済み≫

現在一部のお客様のサイトにて、アップロードした画像を、編集する機能が正常に作動しないため、縦横を変更したり、トリミングしたりすることが出来ません。

error

自動バックアップに使用しているプログラムの修正に伴う弊害です。
現在調査中ですが、「自動バックアップ」と「画像の編集」のどちらか一方だけであれば機能しますのでご連絡ください。現状は、バックアップを優先しています。

 

*********************
詳しい説明はこちら
*********************

バックアッププラグイン「BackWPup」のバックアップ先をDropBoxにしている場合、
SSLチェックのエラーが発生するため、WordPressのサポートフォーラムに掲載されている

BackWPup disable SSL connection verifying
https://wordpress.org/support/topic/error-dropbox-api-59-unknown-cipher-in-list

などのfixで対応している方も多いと思います。
ただ、このfixを適用すると、WordPressの機能の一つである、アップロードした画像ファイルの編集機能が使用できなくなります。
詳細は調査中です。

*********************
追記 2014.10.25
*********************

このfixの途中で一つcodeが紹介されていますが、新しく正常に動くcodeが紹介されていますね。こちらを使用すれば解決できます。 [php] <?php /** * Plugin Name: BackWPup disable SSL connection verifying * Plugin URI: https://marketpress.com/ * Description: Disables the verifying from SSL connections in backup destinations * Author: Inpsyde GmbH * Author URI: http://inpsyde.com * Version: 0.1 * Network: true * License: GPLv3 * License URI: http://www.gnu.org/licenses/gpl-3.0 */ add_filter( ‘backwpup_cacert_bundle’, ‘backwpup_disable_ssl_verify’ ); function backwpup_disable_ssl_verify ( $file ) { return FALSE; } [/php]

bodyのclassにスラッグを入れる

 「このページだけ h3要素は別の色」とかページによって背景の色を変えたいとか

bodyに標準で追加されるクラスは、投稿やページの番号を使用するので、サーバー移行時など、ポストの番号が変更になる恐れがあるときは使えないのですが、ページネームいわゆる「スラッグ」を使えばユニークなクラスを追加することが出来ます。

ただ、日本語でタイトルをつける場合は、スラッグは・・・そこで、スラッグ名を自動で英数字に変換時し、変換したスラッグ名を自動でbodyのクラスに追加すれば投稿やページ毎にユニークなクラス名をつけることが出来ます。

function.php

//スラッグを日本語からポストタイプとポストIDを使った英数字に変換
function auto_post_slug( $slug, $post_ID, $post_status, $post_type ) {
  if ( preg_match( '/(%[0-9a-f]{2})+/', $slug ) ) {
   $slug = 'slug-'.utf8_uri_encode( $post_type ) . '-' . $post_ID;
  }
 return $slug;
}
add_filter( 'wp_unique_post_slug', 'auto_post_slug', 10, 4  );
//bodyのクラスにスラッグを入れる
function add_pagename_class($classes = '') {
  global $post;
  if (is_page()) {
             $page = get_page(get_the_ID());
             $classes[] = $page->post_name;
         }
    return $classes;
}add_filter('body_class','add_pagename_class');

 ちなみに、ちょっと変更すればいろいろなモノを追加できることが分かります。

//bodyのクラスに親のスラッグを入れる
function add_ancestor_class($classes) {
    global $post;
    if (is_page() && (!is_front_page()) ){
        if($post->ancestors){
            foreach($post->ancestors as $post_ancestor_id){
                $post_id = $post_ancestor_id;
            }
        } else {
            $post_id = $post->ID;
        }
        $ancestor_post = get_page($post_id);
        $ancestorSlug = $ancestor_post->post_name;
        $classes[] = 'ancestor_'.$ancestorSlug;
    }
    return $classes;
}
add_filter('body_class','add_ancestor_class');
//bodyのクラスにtaxonomyのスラッグを入れる
function add_taxonomy_class( $classes ){
  if( is_singular() )
  {
    $custom_terms = get_the_terms(0, 'display');
    if ($custom_terms) {
      foreach ($custom_terms as $custom_term) {
        $classes[] = 'tax_' . $custom_term->slug;
      }
    }
  }
  return $classes;
}
add_filter('body_class','add_taxonomy_class');

すべてfunction.phpを変更するので自己責任でお願いします。

もし更新後に「真っ白」になってしまったら慌てず、
FTPでfanction.phpをダウンロードして、間違いを修正してからアップロードすれば元に戻るはず。

簡単なオリジナルテンプレートタグの作り方

使い方は色々ですが、電話番号とかをオリジナルのテンプレートタグにしたり、長ぁ〜いテンプレートタグを短くしてみたり、お問い合わせ一覧出力するテンプレートタグをオリジナルで作れたりします。 まずは簡単に function.php [php] /*でんわ番号 */ fudenction telcode(){ echo ‘TEL:0956-59-8587’; } [/php] 出力したいテンプレートに [html] <?php telcode();?> [/html] で TEL:0956-59-8587 と出力されます。 実際に使ってるのがこれ カスタムフィールドで商品価格のフィールドを作ってテンプレート上で消費税と3桁区切りで表示するコード function.php [php] // 現在の日付を取得 $dt = new DateTime(); $dt->setTimeZone(new DateTimeZone(‘Asia/Tokyo’)); $today = $dt->format(‘Y-m-d H:i:s’); // 消費税8%の施行日付を設定 $start_day = ‘2014-04-01 00:00:01’; // 日付を比較 $tax = 1.05;//旧消費税率 if (strtotime($today) >= strtotime($start_day)) { $tax = 1.08;//新消費税率 } function fee($fee) { global $tax; $fee = $fee*$tax; $oku = floor($fee / 100000000); $man = floor(($fee % 100000000) / 10000); $nokori = ($fee % 100000000) % 10000; $result = ”; if ($oku) $result = number_format($oku) . ‘<span class="toYenOku">億<span>’; if ($man) $result .= number_format($man) . ‘<span class="toYenMan">万</span>’; if ($nokori) $result .= number_format($nokori); if($result): echo ‘<span class="toYen">’.$result.'</span><span class="toYenYen">円</span>’; endif; } [/php] 使いたいテンプレートで カスタムフィールド item_price を $price として取得 テンプレートタグfree()にいれる [html] <?php $price = get_post_meta($post_id, ‘item_price’, $single); ?> <?php fee($price);?> [/html] みたいな感じで桁区切りと消費税計算して表示出来るし、カスタムフィールドのitem_priceは文字列ではなく数値なのでitem_priceの値でソートしてクエリすることも可能。 ついでに、消費税が10%になっても大丈夫!

カスタム投稿タイプのサイドバー

カスタム投稿タイプで

直近の●●件
カテゴリー一覧
月別・年度別アーカイブ

を表示したいとき

  • パーマリンクの設定はデフォルト
  • カスタムポストのカテゴリーはtaxonomy追加で、”カスタムポスト名_cat”

こんな感じのページが出来ます。
http://halu-g.jp/?post_type=report

sidebar.phpとかに

//直近の5件
&lt;ul&gt;
&lt;?php
global $post;
$post_type = get_post_type();
$args = array (
 'post_type' =&gt; $post_type,
 'orderby' =&gt; 'post_date',
 'order' =&gt; 'DESC',
 'numberposts' =&gt; 5
);
$my_posts = get_posts( $args );
foreach ($my_posts as $post) :
 setup_postdata( $post );
?&gt;
&lt;li&gt;&lt;a href="&lt;?php the_permalink();?&gt;"&gt;&lt;?php the_title();?&gt;&lt;/a&gt;&lt;/li&gt;
&lt;?php
endforeach;
wp_reset_postdata();
?&gt;
&lt;/ul&gt;
&lt;p&gt;カテゴリー&lt;/p&gt;
&lt;ul&gt;
&lt;?php wp_list_categories(array('title_li'=&gt;'', 'taxonomy'=&gt;$post_type.'_cat', 'show_count'=&gt;1)); ?&gt;
&lt;/ul&gt;
&lt;p&gt;月別アーカイブ&lt;/p&gt;
&lt;ul&gt;
&lt;?php
 add_filter( 'getarchives_where', 'my_getarchives_where', 10, 2 );
 add_filter( 'get_archives_link', 'my_get_archives_link', 10, 2 );
//直近の12ヶ月分
$my_archive = wp_get_archives('type=monthly&amp;post_type='.$post_type.'&amp;show_post_count=1&amp;limit=12&amp;echo=0');
//年と月を別のフォーマットにかえたいとき利用
//$my_archive = str_replace( array("年"), '.', $my_archive );
//$my_archive = str_replace( array("月"), '', $my_archive );
echo $my_archive;
?&gt;
&lt;/ul&gt;
&lt;p&gt;年間アーカイブ&lt;/p&gt;
&lt;ul&gt;
&lt;?php
echo wp_get_archives('type=yearly&amp;post_type='.$post_type.'&amp;show_post_count=1');
remove_filter( 'getarchives_where', 'my_getarchives_where');
remove_filter( 'get_archives_link', 'my_get_archives_link' );
?&gt;
&lt;/ul&gt;
</pre><p><br />function.php</p><pre>//++++++++++++++++++++++++++++++++++++++++++++++
//カスタム投稿のアーカイブ
//
function my_getarchives_where( $where, $r ) {
 global $my_archives_post_type;
  $my_archives_post_type =get_post_type();
$my_archives_post_type = get_post_type();
 if ( isset($r['post_type']) ) {
 $my_archives_post_type = $r['post_type'];
 $where = str_replace( '\'post\'', '\'' . $r['post_type'] . '\'', $where );
 }
 return $where;
}
//
// ?post_type=任意の名前(パラメーター) を追加する
//
function my_get_archives_link( $link_html ) {
 global $my_archives_post_type;
 $my_archives_post_type = get_post_type();
if ($my_archives_post_type != '') {
 $add_link = '&amp;post_type=' . $my_archives_post_type;
 $link_html = preg_replace('@&lt;/a&gt;(.+?)&lt;/li&gt;@', '年&lt;/a&gt;$1&lt;/li&gt;', $link_html);
 }
 return $link_html ;
}

get_posts() と get_pages() を使い分ける

投稿を抽出するのは、get_posts() 

ページを抽出するのは、get_pages()

それぞれに特化した関数という説明が多いのですが、何が違うのか、まとめてみました。

使用例:カスタムポスト news を

    $args = array(
        'order' => 'DESC',
        'post_type' => array('news'),
      );
$posts_array = get_post($args);
 var_dump($posts_array);
$pages_array = get_pages($args);
 var_dump($pages_array);

 

dumpされて帰ってくるのは

get_post()get_pages()
[“ID”][“ID”]
[“post_author”][“post_author”]
[“post_date”][“post_date”]
[“post_date_gmt”][“post_date_gmt”]
[“post_content”][“post_content”]
[“post_title”][“post_title”]
[“post_excerpt”][“post_excerpt”]
[“post_status”][“post_status”]
[“comment_status”][“comment_status”]
[“ping_status”][“ping_status”]
[“post_password”][“post_password”]
[“post_name”][“post_name”]
[“to_ping”][“to_ping”]
[“pinged”][“pinged”]
[“post_modified”][“post_modified”]
[“post_modified_gmt”][“post_modified_gmt”]
[“post_content_filtered”][“post_content_filtered”]
[“post_parent”][“post_parent”]
 [“guid”]
[“menu_order”][“menu_order”]
[“post_type”][“post_type”]
[“post_mime_type”][“post_mime_type”]
[“comment_count”][“comment_count”]
[“filter”][“filter”]

ということでほぼ同じ

で、 使えるフィルターは、

get_post()get_pages()
posts_per_page child_of
offsetsort_order
categorysort_column
orderbyhierarchical
orderexclude
includeinclude
exclude 
meta_keymeta_key
meta_valuemeta_value
post_typeauthors
post_mime_typeparent
post_parentexclude_tree
post_statusnumber
suppress_filtersoffset
 post_type
 post_status

コレを比較すれば、

まぁ、何が特化されているのかがわかりやすい。

 

get_posts() – 投稿をフィルターすることに特化した関数
get_pages() – ページタイプをフィルターすることに特化した関数

ということでした。

 

アップロードしたPDFの画像化

※追記有り

いつも面倒なPDFファイルの画像化。

WordPressでPDFをアップロードしたときにサムネイル画像を自動的に作ってくれればいいのになぁと思ってました。

サーバーサイドに何か組み込めば出来るんだろうとは思っていたのですが、自分で試行錯誤する前に、プラグインを探してみました。

Advanced uploader

 20140710-1

評価★は・・・無星ですが・・・使えそうです。

 

プラグインをインストールしたら、プラグイン一覧のページから

20140710-2

Settings をクリックすると、設定画面が開きます(通常のメディアの設定画面でも可)。

通常の項目の下に、あたらしくAdvanced uploaderの設定画面が追加されていますので

その中から

Replace Default Uploader に ✓ チェックを入れます。

20140710-3(この画像は、mediumサイズにしてみました。)

あとは、画像の時と同じように、アップロードして、投稿に挿入。

20140710-4投稿に挿入時に、挿入ボタンの上にATTACHMENT IMAGE というセレクトボックスが追加されているので、画像のサイズを選択。

この投稿のキャプチャ画面もアクロバットでキャプチャしたPDFファイルをそのまま、アップロードしてみました。

コレは使える!!

 

追記

生成されるthumbnailのサイズがおかしくなります。

指定した大きさで切り抜く、ハードクロップの指定が効かない模様。
全てのサイズがソフトクロップになってしまいます。

プラグインを有効にしておいて、PDFのアップロード時のみに適用した方が良さそうです。(アップロード時にどちらのアップローダーを使うかを選択できます。)

 

 

WordPressで公開終了日時の予約

WordPressは予約投稿はできても、公開終了日時を設定することはできない。

以前からいろいろ試してたんですが良い仕組みを思いつかないでいましたが、

カスタムフィールドで「公開終了予定時間」というフィールドを作って、表示する際に、現在時間と公開終了予定時間を比較してクエリーで除外すればよいのでは?

ということでやってみました。

20140701更新ネタ

本当は、投稿のステータスを「publish」から「draft」に変更するのがベストなんだと思うけど、この方法だと、使い方次第で、「このイベントは終了しました」なんて表示に切り替えたりも可能かと思います。

これで、大晦日の年度またぎの更新や、真夜中の更新作業ともおさらばできそうです(^^ゞ

詳細は、組み込み予定のサイトがオープンしてから公開しましょう!

jqueryのスクリプトが動かない!

jqueryを何度も呼び出してコンフリクトしてしまうようなら、jqueryの読み込みはWordPressに任せてしまいましょう。

テーマファイルのheader.phpで使いたいスクリプトを読み込むための1行を追加。

<?php wp_enqueue_script(
 'cookie', //使いたいスクリプトの名前
 get_template_directory_uri() . '/js/jquery.cookie.js', //スクリプトファイルへのパス
 array('jquery') //使うライブラリ
); ?>

各スクリプトの1行目を

$(function(){

から

 jQuery(document).ready(function ($){

に変更

 あとは、ソース上にはき出されているかを確認し、あとは、Chromeのデバッグ機能を使って、スクリプトに、jqueryのバージョン違いによる修正を施す。

これでたいがい動くのでは?

 

 

HOME