[PHP]array_group_by

SQLのGROUP BYの様な処理を配列に行う

public function array_group_by($arr,$keys = array(array('id','address'),array('name') ),$index = 0)
{
    if(empty($arr))
        return null;
    $results = array();
    $children = array();
    $_vkey = $keys[$index][0];
    $_keys = array_slice($keys,0,$index+1);
    $is_final = count($keys) <= $index + 1;
    $id = null;
    array_push($arr,null);
    foreach ($arr as $i => $data){
        $current_id = $this->get_values_by_keys($data,$_keys,'');
        if($id != $current_id){
            if(!is_null($id)) {
                if(!empty($children)) {
                    $tmp = $this->get_std_by_array($children[0], $keys[$index]);
                    $tmp->value = $children[0]->$_vkey;
                }else{
                    $tmp = new stdClass();
                }
                $tmp->children = $is_final ? $children : $this->array_group_by($children,$keys,$index+1);
                $results[] = $tmp;
                $children = array();
            }
            $id = $current_id;
        }
        $children[] = $data;
    }
    return $results;
}
public function get_std_by_array($arr,$include_keys = null)
{
    $tmp = new stdClass();
    foreach ($arr as $key => $v){
        if(empty($include_keys) || (!empty($include_keys) && in_array($key,$include_keys)))
            $tmp->$key = $v;
    }
    return $tmp;
}
public function get_values_by_keys($data,$keys,$glue = null)
{
    if(empty($data))
        return null;
    $tmp = array();
    foreach ($keys as $key){
        if(is_array($key))
            $key = array_shift(array_values($key));
        $tmp[] = $data->$key;
    }
    return is_null($glue) ? $tmp : implode($glue,$tmp);
}

[MovableType]アーカイブマッピング:yyyymmdd_x.html

x
同じ日付の記事1つ目:1
同じ日付の記事2つ目:2

<mt:For regex_replace="/[\ \t\r\n]/mg","">
<mt:EntryDate format="%Y%m%d" setvar="current_entry_date" />
<mt:EntryID setvar="current_entry_id" />
<mt:EntryBlogID setvar="blog_id"/>
<mt:Blogs blog_ids="$blog_id">
<mt:Var name="count" value="1"/>
<mt:Var name="no" value="1"/>
<mt:Entries lastn="0" sort_by="authored_on" sort_order="ascend">
<mt:EntryDate format="%Y%m%d" setvar="entry_date" />
<mt:EntryID setvar="entry_id" />
<mt:If name="entry_date" eq="$current_entry_date">
<mt:If name="entry_id" eq="$current_entry_id"><mt:Var name="no" value="$count"/></mt:If>
<mt:SetVar name="count" op="++"/>
</mt:If>
</mt:Entries>
</mt:Blogs>
<mt:Var name="current_entry_date"/>_<mt:Var name="no"/>.html</mt:For>

[WordPress]テーブル接頭辞を変更

・wp-config.php

$table_prefix = 'dev_wp_';

$table_prefix = 'wp_';

へ変更

・下記を実行

ALTER TABLE dev_wp_commentmeta RENAME TO wp_commentmeta;
ALTER TABLE dev_wp_comments RENAME TO wp_comments;
ALTER TABLE dev_wp_links RENAME TO wp_links;
ALTER TABLE dev_wp_options RENAME TO wp_options;
ALTER TABLE dev_wp_postmeta RENAME TO wp_postmeta;
ALTER TABLE dev_wp_posts RENAME TO wp_posts;
ALTER TABLE dev_wp_term_relationships RENAME TO wp_term_relationships;
ALTER TABLE dev_wp_term_taxonomy RENAME TO wp_term_taxonomy;
ALTER TABLE dev_wp_usermeta RENAME TO wp_usermeta;
ALTER TABLE dev_wp_users RENAME TO wp_users;
ALTER TABLE dev_wp_terms RENAME TO wp_terms;
UPDATE wp_options SET option_name = 'wp_user_roles' WHERE option_name = 'dev_wp_user_roles';
UPDATE wp_usermeta SET meta_key = 'wp_capabilities' WHERE meta_key = 'dev_wp_capabilities';
UPDATE wp_usermeta SET meta_key = 'wp_user_level' WHERE meta_key = 'dev_wp_user_level';

[WordPress]Advanced Custom Fields: DB Field

Advanced Custom Fields: DB Field をリリースしました。
https://wordpress.org/plugins/acf-db-field/
https://github.com/ktyrnet/acf-db

ACFのアドオンなのでACFがインストールされている必要があります。
・任意のDB,テーブル,カラムを選択させるカスタムフィールドを追加出来ます。
・現在はWordPressと同じDBアカウントのDBにしか対応していません。

カスタムフィールド設定画面

投稿画面

[WordPress]EC2で現地時間が+9時間になる

AWS EC2上のWordPressにおいて
設定 > 一般 > タイムゾーン : 東京 の時、下記の症状が出る。
・世界標準時 (UTC) は “東京の時間” です。 現地時間は “東京の時間+9時間” です。
・記事を新規作成して「すぐに公開する」で公開しても、「予約済み」になる。

対処法
・SSHでサーバへ接続
・コマンド「sudo yum reinstall tzdata」
・コマンド「sudo service httpd restart」

[WordPress]タクソノミー管理画面にID列追加

タクソノミー:xxxxx

function add_columns_to_edit_category( $columns ){
    $new_columns = array();
    foreach ( $columns as $column_name => $column_display_name ) {
        if( $column_name == 'name' ) {
            $new_columns['ID'] = 'ID';
            echo '<style>#ID{width:70px;}</style>';
        }
        $new_columns[ $column_name ] = $column_display_name;
    }
    return $new_columns;
}
add_filter( "manage_edit-xxxxx_columns", 'add_columns_to_edit_category', 10);

function output_column_value_category( $value, $column_name, $term_id )
{
    $t = get_term($term_id);
    switch ($column_name){
        case 'ID':
            echo $t->term_id;
            break;
        default:
            break;
    }
}
add_action( "manage_xxxxx_custom_column", 'output_column_value_category', 10, 3);

[WordPress]TransientAPI#3

    public function delete_transient($transient)
    {
        delete_transient($transient);
    }
    public function delete_all_transient()
    {
        global $wpdb;
        $sql = "DELETE FROM `{$wpdb->options}` WHERE `option_name` LIKE ('_transient_%');";
        $result = $wpdb->get_results($sql);
        $sql = "DELETE FROM `{$wpdb->options}` WHERE `option_name` LIKE ('_site_transient_%');";
        $result = $wpdb->get_results($sql);
    }

[WordPress]TransientAPI#2

public function get_transient_by_query($query)
{
    if(!$this->use_transient)
        return false;
    return $this->get_transient(md5($query));
}
public function get_transient($transient)
{
    if(!$this->use_transient)
        return false;
    return get_transient($transient);
}

[WordPress]TransientAPI#1

public function set_transient_by_query($query, $value, $expiration = -1)
{
    if(!$this->use_transient)
        return;
    $this->set_transient(md5($query),$value,$expiration);
}
public function set_transient($transient, $value, $expiration = -1)
{
    if(!$this->use_transient)
        return;
    if($expiration < 0)
        $expiration = $this->transient_expiration;
    set_transient($transient, $value, $expiration );
}

[WordPress]カスタム投稿タイプxxxx一覧にカラム追加

function add_columns_to_xxxxx( $columns )
{
    $new_columns = array();
    foreach ( $columns as $column_name => $column_display_name ) {
        if( $column_name == 'title' ) {
            $new_columns['ID'] = 'ID';
        }
        $new_columns[ $column_name ] = $column_display_name;
    }
    return $new_columns;
}
add_filter('manage_xxxxx_posts_columns' , 'add_columns_to_xxxxx');

function output_column_value_xxxxx( $column, $post_id )
{
    switch ( $column ) {
        case 'ID':
            echo $post_id;
            break;
    }
}
add_action( 'manage_xxxxx_posts_custom_column' , 'output_column_value_xxxxx', 10, 2 );