WordPress

[WordPress]先祖postへのリンクを出力する

function get_parents($post,$parents = array())
{
    if (!empty($post->post_parent)){
        $parent = get_post($post->post_parent);
        array_unshift( $parents, $parent);
        return get_parents( $parent, $parents );
    }
    return $parents;
}
function the_parents($post,$format)
{
    $parents = get_parents($post);
    if(!empty($parents)){
        foreach($parents as $i => $parent){
            $html = $format;
            $html = preg_replace('/%permalink%/',get_permalink($parent->ID),$html);
            $html = preg_replace('/%title%/',esc_html($parent->post_title),$html);
            echo $html;
        }
    }
}

[WordPress]管理画面でjs,cssを読み込む

function add_admin_style()
{
    wp_enqueue_script('admin_script', get_template_directory_uri().'/scripts/admin.js');
    wp_enqueue_style('admin_style', get_template_directory_uri().'/style/admin.css');
}
add_action('admin_enqueue_scripts', 'add_admin_style');

[WordPress]不要メニューを非表示

function custom_remove_menus()
{
    global $menu;
    /** 投稿 */
    remove_menu_page('edit.php');
    /** コメント */
    remove_menu_page('edit-comments.php');
}
add_action('admin_menu', 'custom_remove_menus');

[WordPress]ACFカスタムフィールドプレビュー

公開済みの記事を編集してプレビューするとカスタムフィールドの値が古いままなのを解決する
※公式対応までのつなぎ

 
functions.phpに下記追記

/**
 * $dataをjsonで出力
 */
function echo_json($data)
{
    header("Content-Type: application/json; charset=utf-8");
    echo json_encode($data);
}
/**
 * テンプレートのadmin.jsを読み込む
 */
function add_admin_style()
{
    $path_js = get_template_directory_uri().'/scripts/admin.js';
    wp_enqueue_script('admin_script', $path_js);
}
add_action('admin_enqueue_scripts', 'add_admin_style');
/**
 * ajaxで送信されたカスタムフィールドの値をdbへ保存
 */
function save_acf_by_ajax()
{
    if(empty($_POST['post_id'])){
        echo_json(['success' => false,'preview_id' => 0]);
        wp_die();
        exit;
    }
    $post_id = $_POST['post_id'];
    $post_status = get_post_status($post_id);
    if($post_status !== "publish"){
        echo_json(['success' => false,'preview_id' => 0]);
        wp_die();
        exit;
    }
    $preview_id = 0;
    global $wpdb;
    $row = $wpdb->get_row("SELECT p.ID FROM $wpdb->posts AS p WHERE p.post_type = '_cf_preview_id' AND p.post_parent = ${post_id}");
    if(empty($row)) {
        $post = array(
            'post_name'      => '_cf_preview_id',
            'post_title'     => '_cf_preview_id',
            'post_status'    => 'private',
            'post_type'      => '_cf_preview_id',
            'post_author'    => 1,
            'ping_status'    => 'closed',
            'post_parent'    => $post_id,
            'comment_status' => 'closed',
        );
        $preview_id = wp_insert_post($post);
    }else{
        $preview_id = $row->ID;
    }
    unset($_POST['action']);
    unset($_POST['post_id']);
    unset($_POST['preview_id']);
    if(!empty($preview_id)) {
        foreach ($_POST as $key => $value) {
            update_field($key, $value, $preview_id);
        }
    }
    $_POST['post_id'] = $post_id;
    $_POST['preview_id'] = $preview_id;
    $_POST['success'] = !empty($preview_id);
    echo_json($_POST);
    wp_die();
}
add_action( 'wp_ajax_save_acf_by_ajax_action', 'save_acf_by_ajax' );
/**
 * プレビュー時カスタムフィールドの値用のpostidを返す
 */
function get_cf_post_id($post_id = '')
{
    if(empty($post_id)){
        $post_id = get_the_ID();
    }
    $cf_post_id = $post_id;
    if(is_preview()){
        $post_status = get_post_status($post_id);
        if($post_status === 'publish'){
            global $wpdb;
            $row = $wpdb->get_row("SELECT p.ID FROM $wpdb->posts AS p WHERE p.post_type = '_cf_preview_id' AND p.post_parent = ${post_id}");
            if (!empty($row)) {
                $cf_post_id = $row->ID;
            }
        }
    }
    return $cf_post_id;
}

wp-content/themes/テーマ/assets/js/admin.jsに下記追記

class CFSaveManager {
    qsall(selector,elm){
        if(!elm)elm = document;
        return elm.querySelectorAll(selector);
    }
    qs(selector,elm){
        if(!elm)elm = document;
        return elm.querySelector(selector);
    }
    constructor(){
    }
    /* 初期化 */
    init(){
        this.initAutoSave();
    }
    /* プレビューボタンにイベント設定 */
    initAutoSave(){
        const button = this.qs('.block-editor-post-preview__button-toggle');
        if(!button){
            setTimeout(() => {
                this.initAutoSave();
            },200);
            return;
        }
        button.addEventListener('click',() => {
            this.autoSave();
        });
    }
    /* ajaxでカスタムフィールドの値をapiへ送信・保存 */
    autoSave(){
        const elm = this.qs('[name="post_ID"]');
        const form = this.qs('form.metabox-location-normal');
        const formData = new FormData(form);
        let sendFormData = new FormData();
        for (let item of formData) {
            if(/^acf\[.+\]$/.test(item[0])){
                var matches = item[0].match(/acf\[(.+)\]/);
                if(matches && 1 < matches.length){
                    sendFormData.append(matches[1],item[1]);
                }
            }else{
                sendFormData.append(item[0],item[1]);
            }
        }
        sendFormData.append('action','save_acf_by_ajax_action');
        sendFormData.append('post_id',elm.value);
        const options = {
            method  : "POST",
            headers : {
                'Accept': 'application/json'
            },
            body    : sendFormData
        };
        fetch(window.ajaxurl,options)
            .then((response)=>{
                if (!response.ok) {
                    throw new Error();
                }
                return response.json();
            })
            .then((json)=>{
                console.log(json);
            })
            .catch(console.error);
    }
}
window.addEventListener('DOMContentLoaded',(e) => {
    const cfsm = new CFSaveManager();
    cfsm.init();
});

wpテンプレでカスタムフィールドの値を出力する部分

$post_id = get_the_ID();
$cf_preview_id = $post_id;
if(is_preview()){
    $post_status = get_post_status($post_id);
    if($post_status === 'publish'){
        global $wpdb;
        $row = $wpdb->get_row("SELECT p.ID FROM $wpdb->posts AS p WHERE p.post_type = '_cf_preview_id' AND p.post_parent = ${post_id}");
        if (!empty($row)) {
            $cf_preview_id = $row->ID;
        }
    }
}
$value = get_field( "test_text1" ,$cf_preview_id );
echo "cf_preview_id:$cf_preview_id<br>";
echo "<h2>test_text1:".esc_html($value)."</h2>";

[WordPress]MW WP Formの問い合わせデータ表示順指定カスタムフィールド追加

functions.phpに下記を追記

// カスタムフィールドボックス[問い合わせデータの表示順]
function add_mw_order_fields() {
    //add_meta_box(表示される入力ボックスのHTMLのID, ラベル, 表示する内容を作成する関数名, 投稿タイプ, 表示方法)
    add_meta_box( 'mw_order_setting', '問い合わせデータの表示順', 'insert_mw_order_fields', 'mw-wp-form', 'normal');
}
add_action('admin_menu', 'add_mw_order_fields');
// カスタムフィールドの入力エリア[問い合わせデータの表示順]
function insert_mw_order_fields() {
    global $post;
    echo '<div><input style="width: 100%;" type="text" name="mw_order" value="'.get_post_meta($post->ID, 'mw_order', true).'" size="50" placeholder=""/></div>';
}
// カスタムフィールドの値を保存[問い合わせデータの表示順]
function save_mw_order_fields( $post_id ) {
    if(!empty($_POST['mw_order'])){
        update_post_meta($post_id, 'mw_order', $_POST['mw_order'] );
    }else{
        delete_post_meta($post_id, 'mw_order');
    }
}
add_action('save_post', 'save_mw_order_fields');
// カスタムフィールドの値による問い合わせデータ表示順設定
function my_mwform_inquiry_data_columns( $columns ) {
    if(empty($_GET['post_type']) || strpos($_GET['post_type'],'mwf_') === false){
        return $columns;
    }
    $tmp = explode('_',$_GET['post_type']);
    if(count($tmp) < 2 || !is_numeric($tmp[1])) {
        return $columns;
    }
    $meta = get_post_meta($tmp[1],'mw_order',true);
    if (empty($meta)) {
        return $columns;
    }
    $order = explode(',',$meta);
    $result = [];
    foreach ($order as $key => $value){
        if(empty($value))continue;
        $result[$value] = $value;
    }
    return $result;
}
// フィルターフックの要否を判定し必要なら処理を設定する
if(!empty($_GET['post_type']) && strpos($_GET['post_type'],'mwf_') === 0){
    $tmp = explode('_',$_GET['post_type']);
    if(1 < count($tmp) && is_numeric($tmp[1])) {
        $meta = get_post_meta($tmp[1], 'mw_order',true);
        if (!empty($meta)) {
            add_filter('mwform_inquiry_data_columns-mwf_' . $tmp[1], 'my_mwform_inquiry_data_columns');
        }
    }
}

 
追加されたカスタムフィールドへnameをカンマ区切りで入力する。

[WordPress]アップロード画像の複数サイズ自動生成停止

下記実行

update wp_options set option_value='0' where option_name = 'thumbnail_size_w';
update wp_options set option_value='0' where option_name = 'thumbnail_size_h';
update wp_options set option_value='0' where option_name = 'medium_size_w';
update wp_options set option_value='0' where option_name = 'medium_size_h';
update wp_options set option_value='0' where option_name = 'large_size_w';
update wp_options set option_value='0' where option_name = 'large_size_h';
update wp_options set option_value='0' where option_name = 'medium_large_size_w';
update wp_options set option_value='0' where option_name = 'medium_large_size_h';

 
functions.phpに下記追加

function disable_image_sizes( $new_sizes ) {
    unset( $new_sizes['1536x1536'] );
    unset( $new_sizes['2048x2048'] );
    unset( $new_sizes['post-thumbnail'] );
    unset( $new_sizes['category-thumb'] );
    unset( $new_sizes['homepage-thumb'] );
    return $new_sizes;
}
add_filter( 'intermediate_image_sizes_advanced', 'disable_image_sizes' );

add_filter( 'big_image_size_threshold', '__return_false' );