[WordPress]テンプレ切替

function add_user_rewrite_rules()
{
    add_rewrite_rule("^post_type1/?$", "index.php?post_type=post_type1&mode=archive", 'top');
    add_rewrite_rule("^post_type1/article/([^\/]+)/?$", 'index.php?post_type=post_type1&name=$matches[1]&mode=single', 'top');
    add_rewrite_rule("^post_type2/?$", "index.php?post_type=post_type2&mode=archive", 'top');
    add_rewrite_rule("^post_type2/(\d+)/?$", 'index.php?post_type=post_type2&p=$matches[1]&mode=single', 'top');
}
add_action('init', 'add_user_rewrite_rules');

function add_user_routes_query_vars($query_vars)
{
    $query_vars[] = 'mode';
    $query_vars[] = 'param';
    return $query_vars;
}
add_filter('query_vars', 'add_user_routes_query_vars');

/**
 * is_single,is_archiveの返値が確定する前に処理
 * @param $query
 */
function my_parse_request($query)
{
    if(is_admin())
        return;
    
    if($query->query_vars['post_type'] === 'post_type1') {
        $query->query_vars['posts_per_page'] = 10;
    }else if($query->query_vars['post_type'] === 'post_type2') {
        $query->query_vars['posts_per_page'] = 20;
    }else if($query->query_vars['post_type'] === 'post_type3'){
    }
}
add_action( 'parse_request', 'my_parse_request');

function my_pre_get_posts( $query )
{
    if ( is_admin() || ! $query->is_main_query() ){
        return;
    }
    if($query->query['post_type'] === 'post_type1') {
        if (!empty($_GET['api'])) {
            if(!empty($_GET['count']) && preg_match('/^\d+$/',$_GET['count'])){
                $query->set('posts_per_page',$_GET['count']);
            }else{
                $query->set('posts_per_page',3);
            }
        }
    }else if($query->query['post_type'] === 'post_type2') {
        if (!empty($_GET['api'])) {
            if (isset($_GET['cate'])) {
                $tax_query[] = array(
                    'taxonomy' => 'tax_type',
                    'terms'    => array($_GET['cate']),
                    'field'    => 'slug',
                    'operator' => 'IN');
                $query->set('tax_query', array('relation' => 'OR', $tax_query));
            }
            if(!empty($_GET['count']) && preg_match('/^\d+$/',$_GET['count'])){
                $query->set('posts_per_page',$_GET['count']);
            }else{
                $query->set('posts_per_page',3);
            }
        }else if (isset($query->query['param'])) {
            $tax_query[] = array(
                'taxonomy' => 'tax_type',
                'terms'    => array($query->query['param']),
                'field'    => 'slug',
                'operator' => 'IN');
            $query->set('tax_query', array('relation' => 'OR', $tax_query));
        }
    }
}
add_action('pre_get_posts','my_pre_get_posts');

/**
 * テンプレートファイル切替
 * @param $template
 * @return mixed
 */
function my_template_include($template)
{
    global $wp_query;
    if($wp_query->query['post_type'] === 'post_type1' && isset($wp_query->query['mode']) && $wp_query->query['mode'] === 'top') {
        $bn = basename($template);
        return preg_replace("/{$bn}$/","index-post_type1.php",$template);
        
    }else if($wp_query->query['post_type'] === 'post_type2' && isset($wp_query->query['mode']) && $wp_query->query['mode'] === 'top'){
        $bn = basename($template);
        return preg_replace("/{$bn}$/","archive-post_type2.php",$template);

    }else if($wp_query->query['post_type'] === 'post_type3'){
        if($wp_query->query['mode'] === 'single'){
            $bn = basename($template);
            return preg_replace("/{$bn}$/","single-post_type3.php",$template);
        }
    }
    return $template;
}
add_filter('template_include','my_template_include');


[WordPress]wp_enqueue_script

function my_original_option()
{
    add_menu_page('オリジナルメニュー','オリジナルメニュー','manage_options','my_option','my_option','',30);
}
add_action('admin_menu', 'my_original_option');

function my_option()
{
    include TEMPLATEPATH . DIRECTORY_SEPARATOR . 'my_option.php';
}
function my_register_scripts()
{
    if(is_admin() && !empty($_GET['page']) && $_GET['page']==='my_option') {
        $keyname = 'my_option';
        $result = wp_register_script($keyname, get_template_directory_uri() . '/scripts/admin-custom.js', array('jquery', 'jquery-ui-sortable'));
        wp_enqueue_script($keyname);
    }
}
add_action('init', 'my_register_scripts');

[PHP]idiorm #5 raw_execute

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_datas
{
$sql = array();
$sql[] = "SELECT * FROM wp_posts";
$this->init_pgsql();
try{
    $res = ORM::raw_execute(implode(" ",$sql));
    $statement = ORM::get_last_statement();
    $rows = array();
    $results = array();
    while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
        $results[] = $this->get_std_by_array($row);
    }
}catch (PDOException $e){
}
return empty($results) ? null : $results;
}

[PostgreSQL]カラム名、カラムコメント取得

SELECT
psat.relname AS TABLE_NAME,pa.attname AS COLUMN_NAME,pd.description AS COLUMN_COMMENT
FROM
pg_stat_all_tables AS psat,pg_description AS pd,pg_attribute AS pa
WHERE
psat.schemaname = (SELECT schemaname FROM pg_stat_user_tables WHERE relname = 'テーブル名') AND psat.relname = 'テーブル名' AND psat.relid = pd.objoid AND pd.objsubid <> 0 AND pd.objoid = pa.attrelid AND pd.objsubid = pa.attnum
ORDER BY pd.objsubid

[WordPress]ACF Pro Wysiwyg用関数

public function is_empty_wysiwyg_content($content)
{
    $content = $this->get_string_from_wysiwyg_content($content);
    return $content === '';
}
public function get_wysiwyg_content($content)
{
    return apply_filters('acf_the_content',$content);
}
public function get_string_from_wysiwyg_content($_content)
{
    $is_empty = trim(preg_replace('/<[^>]+?>/','',$_content)) == ' ';
    if($is_empty)
        return '';
    return trim(html_entity_decode(preg_replace('/<[^>]+?>/','',$_content)));
}

[WordPress]タクソノミー、タームから記事数取得

public function get_posts_count_by_taxonomy_slug($taxonomy, $term = '')
{
    global $wpdb;
    $sql = array();
    $sql[] = "SELECT";
    $sql[] = "COUNT(tr.object_id) AS count";
    $sql[] = "FROM $wpdb->term_relationships AS tr";
    $sql[] = "LEFT JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";
    $sql[] = "LEFT JOIN $wpdb->terms AS t ON tt.term_id = t.term_id";
    $sql[] = "LEFT JOIN $wpdb->posts AS p ON tr.object_id = p.ID";
    $sql[] = "WHERE p.post_status = 'publish'";
    if (!empty($term))
        $sql[] = "AND t.slug ='$term'";
    $sql[] = "AND tt.taxonomy = '$taxonomy'";
    if (empty($term))
        $sql[] = "GROUP BY tr.object_id";

    $posts = $wpdb->get_results(implode(' ', $sql));
    return empty($posts) ? 0 : $posts[0]->count;
}

[WordPress][プラグイン]WordPress Popular Posts

プラグインWordPress Popular Postsによって閲覧数が保存されている時
指定投稿タイプの記事IDを閲覧数の多い順に取得する

public function get_post_ids_order_by_views_wppp($post_type = 'post', $param = array())
{
    $param = array_merge(
        array(
            'posts_per_page' => 5,
            'range' => '1 MONTH',
            'return_posts' => false,
        ),
        $param
    );
    global $wpdb;
    $now = current_time('mysql');
    $interval = "";
    switch ($param['range']) {
        case "yesterday":
            $interval = "1 DAY";
            break;
        case "daily":
            $interval = "1 DAY";
            break;
        case "weekly":
            $interval = "1 WEEK";
            break;
        case "monthly":
            $interval = "1 MONTH";
            break;
        default:
            $interval = $param['range'];
            break;
    }
    $sql[] = "SELECT postid AS ID,SUM(pageviews) AS views,p.post_type";
    $sql[] = "FROM {$wpdb->prefix}popularpostssummary AS pps";
    $sql[] = "LEFT JOIN $wpdb->posts AS p ON pps.postid = p.ID";
    $sql[] = "WHERE view_datetime > DATE_SUB('{$now}', INTERVAL $interval)";
    $sql[] = "AND p.post_type " . (is_array($post_type) ? "IN ('" . implode("','", $post_type) . "')" : "= '$post_type'");
    $sql[] = "AND p.post_status = 'publish'";
    if (!empty($param['post_id'])) {
        $sql[] = "AND postid " . (is_array($param['post_id']) ? "IN (" . implode(",", $param['post_id']) . ")" : "= {$param['post_id']}");
    }
    if (!empty($param['not_post_id'])) {
        $sql[] = "AND postid " . (is_array($param['not_post_id']) ? "NOT IN (" . implode(",", $param['not_post_id']) . ")" : "!= {$param['not_post_id']}");
    }
    $sql[] = "GROUP BY postid";
    $sql[] = "ORDER BY views DESC";
    if (!empty($param['ppp'])) {
        $sql[] = "LIMIT 0,{$param['ppp']}";
    }elseif (!empty($param['posts_per_page'])) {
        $sql[] = "LIMIT 0,{$param['posts_per_page']}";
    }
    $posts = $wpdb->get_results(implode(' ', $sql));
    if ($param['return_posts'])
        return $posts;
    $ids = array();
    foreach ($posts as $post) {
        $ids[] = $post->ID;
    }
    return $ids;
}

[PHP]idiorm #4 raw_query

try{
    $sql = "SELECT * FROM shops WHERE name LIKE ? OR name LIKE ?";
    $words = array("%銀座%","%御徒町%");
    $items = ORM::for_table('shops')->raw_query($sql,$words)->find_array();
}catch (PDOException $e){
    return null;
}
return $items;

[PHP]idiorm #3 select_expr

$this->init_pgsql();
try{
    $orm = ORM::for_table('users')->select_expr("DISTINCT CONCAT(team,'_',job)","tj")->select('team')->select('job');
    $orm->where_in('team',$teams);
    $records = $orm->find_array();
}catch (PDOException $e){
    return null;
}
return $records;

[WordPress]Gutenberg下のプレビューURL変更

/**
 * Gutenbergによる投稿プレビューのURL(プレビュー生成中からのリダイレクト先)を変更する
 * WordPress 5.3.2で動作確認
 * @param $response
 * @return array
 */
function my_rest_pre_echo_response($response)
{
    if(!is_user_logged_in())
        return;
    if($response['status'] === 'draft'){
        $response['link'] = '任意のURL';
    }
    return $response;
}
add_filter( 'rest_pre_echo_response', 'my_rest_pre_echo_response', 100 );