テーマ開発であれば _s あるいは Iemoto を使えばだいぶ工数が減らせる。
ただし、両者とも公式ディレクトリに掲載されるテーマの作成を前提にした構成・コードなので、クエリの改変やサブクエリ、自作ウィジェットなどのコードは入っていない。
普段は開発に Coda 2 を使っていて「クリップ」にコードは詰め込んでいるのでそれを中心に。
条件などはよしなに。
メインクエリ
pre_get_posts
とis_main_query
https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts
<?php
function modify_main_query( $query ) {
if ( is_admin() || ! $query->is_main_query() ) // ダッシュボードあるいはメインクエリではない場合は除外
return;
if ( $query->is_category() ) {
$query->set( 'posts_per_page', -1 );
return;
}
}
add_action( 'pre_get_posts', 'modify_main_query' );
サブクエリ
WP_Query
https://codex.wordpress.org/Class_Reference/WP_Query
<?php
$args = array(
'posts_per_page' => 5,
'post_type' => 'post',
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
/* do stuff
the_title(), the_permalink() 等使用可
*/
}
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
get_posts
https://codex.wordpress.org/Function_Reference/get_posts
<?php
$args = array(
'posts_per_page' => 5,
'offset' => 0,
'category' => '',
'orderby' => 'post_date',
'order' => 'DESC',
'include' => '',
'exclude' => '',
'meta_key' => '',
'meta_value' => '',
'post_type' => 'post',
'post_mime_type' => '',
'post_parent' => '',
'post_status' => 'publish',
'suppress_filters' => true
);
$my_posts = get_posts( $args );
global $post; // テーマファイル内なら書かなくても良い
if ( !empty( $my_posts ) ) {
foreach ( $my_posts as $post ) {
setup_postdata( $post );
/* do stuff
the_title(), the_permalink() 等使用可
*/
}
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
WordPress に含まれている jQuery を使うときの自作 jQuery コード
- WordPress に含まれている jQuery は noConflict モード
- それが嫌でCDNなどの jQuery を使うって方法を見かけるけど WordPress 本体やプラグインで使っているケースが多いので、正直やめたほうがいい。
jQuery( document ).ready( function( $ ) {
// $() will work as an alias for jQuery() inside of this function
// code
} );
あるいは
(function($){
// code
})(jQuery);
余談だが WordPress には jQuery 以外のスクリプト(例えば jQuery UI や Masonry)も含まれている。先ほどのリンクを参照。
例えば jQuery UI Tabs を使いたいときは wp_enqueue_script( 'jquery-ui-tabs' );
と書くだけで、必要な JavaScript ファイルを適切な順番で読み込んでくれる。
jQuery UI Tabsの場合は他に、jQuery 本体, jQuery UI Core, jQuery UI Widget。
ただし、css は含まれないのでよしなに。
ウィジェット
<?php
/**
* Adds Foo_Widget widget.
*/
class Foo_Widget extends WP_Widget {
/**
* Register widget with WordPress.
*/
function __construct() {
parent::__construct(
'foo_widget', // Base ID
__( 'Widget Title', 'text_domain' ), // Name
array( 'description' => __( 'A Foo Widget', 'text_domain' ), ) // Args
);
}
/**
* Front-end display of widget.
*
* @see WP_Widget::widget()
*
* @param array $args Widget arguments.
* @param array $instance Saved values from database.
*/
public function widget( $args, $instance ) {
echo $args['before_widget'];
if ( ! empty( $instance['title'] ) ) {
echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
}
echo __( esc_attr( 'Hello, World!' ), 'text_domain' );
echo $args['after_widget'];
}
/**
* Back-end widget form.
*
* @see WP_Widget::form()
*
* @param array $instance Previously saved values from database.
*/
public function form( $instance ) {
$title = ! empty( $instance['title'] ) ? $instance['title'] : __( 'New title', 'text_domain' );
?>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php _e( esc_attr( 'Title:' ) ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
</p>
<?php
}
/**
* Sanitize widget form values as they are saved.
*
* @see WP_Widget::update()
*
* @param array $new_instance Values just sent to be saved.
* @param array $old_instance Previously saved values from database.
*
* @return array Updated safe values to be saved.
*/
public function update( $new_instance, $old_instance ) {
$instance = array();
$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
return $instance;
}
} // class Foo_Widget
GenerateWP サービス
カスタム投稿タイプやタクソノミーなどはこっちで作ったほうが速い。だってパラメーターが多いのだもの。作ったコードも保存しておける。
作れるものは以下(たまに増える)。一部有料($9/月)の機能は * 印 。見出しは GenerateWP に合わせてある。
管理向け
-
Toolbar Generator : 管理バーのメニュー
WP_Admin_Bar
クラス -
Dashboard Widgets Generator * : ダッシュボードウィジェット
wp_add_dashboard_widget()
- Quicktags Generator : 投稿のテキストエディタのクイックタグ
-
oEmbed Providers : oEmbed プロバイダーの追加
wp_oembed_add_provider()
- User Contact Methods Generator : ユーザープロフィール「連絡先情報」の追加項目
-
Settings Page * : ダッシュボードの設定メニューにサブメニュー追加
add_options_page()
コンテンツ
-
Shortcodes Generator : ショートコード
add_shortcode()
-
Post Type Generator : カスタム投稿タイプ
register_post_type()
-
Taxonomy Generator : カスタムタクソノミー
register_taxonomy()
-
Meta Box Generator * : 投稿編集画面のメタボックス
add_meta_box()
- Term Meta Generator * : タームのメタフィールド(Term Meta)作成
-
Post Status Generator : 投稿ステータス(asideなど)
register_post_status()
コア
-
Hooks Generator : カスタムフック
add_filter()
とadd_action()
- wp-config.php Generator : wp-config.php のカスタマイズ
- Plugin Readme Generator : WordPressプラグインの readme.txt
-
Schedule Cron Job Event : Cron ジョブ
wp_schedule_event()
-
Register WordPress Scripts : スクリプト(JavaScript)の登録
wp_register_script()
-
Register WordPress Styles : CSSの登録
wp_register_style()
デザイン
-
Menu Generator : カスタムメニュー
register_nav_menus()
-
Sidebar Generator : サイドバー
register_sidebar()
-
Widgets Generator * : ウィジェット
WP_Widget
クラス -
Theme Support Generator : テーマサポート
add_theme_support()
-
Theme Default Headers Generator : テーマのデフォルトヘッダーまわり
register_default_headers()
クエリ
-
WP_Query Generator : 投稿のクエリ
WP_Query
クラス -
WP_User_Query Generator : ユーザーのクエリ
WP_User_Query
クラス -
WP_Comment_Query Generator : コメントのクエリ
WP_Comment_Query
クラス -
WP_Term_Query Generator : タームのクエリ
WP_Term_Query
クラス -
WP_Network_Query Generator : マルチサイトのネットワークに関するクエリ
WP_Network_Query
クラス -
WP_Site_Query Generator : マルチサイトのサイトに関する
WP_Site_Query
クラス -
WP_Tax_Query Generator : タクソノミーのクエリ
WP_Tax_Query
クラス -
WP_Meta_Query Generator : メタのクエリ
WP_Meta_Query
クラス -
WP_Date_Query Generator : 日付(投稿日時)のクエリ
WP_Date_Query
クラス
一般的(汎用)
- Custom Snippet : 自作 Snippet を共有したい時