PhpSpreadsheet 를 이용한 엑셀파일 다운로드 개발

PHPExcel을 사용해서 엑셀 파일을 생성해왔는데 PHPExcel의 개발이 중단되어 PhpSpreadsheet를 사용하게 됐다.

Githut Repo : https://github.com/PHPOffice/PhpSpreadsheet
개발문서 : https://phpspreadsheet.readthedocs.io/en/develop/

PhpSpreadsheet 패키지 설치는 Composer를 이용하며 사용에 필요한 PHP 버전 등은 아래와 같다.

  • PHP version 5.6 or newer
  • PHP extension php_zip enabled
  • PHP extension php_xml enabled
  • PHP extension php_gd2 enabled (if not compiled in)

Composer 를 이용한 PhpSpreadsheet 설치는 아래의 명령을 실행한다.

composer require phpoffice/phpspreadsheet

Compser를 이용해 PhpSpreadsheet 를 설치했다면 아래의 코드로 엑셀파일 다운로드 기능을 테스트 해볼 수 있다. Read More

워드프레스 포스트 편집 화면에 메타박스 추가하기

위 이미지와 같은 커스텀 메타박스를 편집 화면에 추가하는 방법으로 플러그인 형태로 코드를 작성했다.

<?php

/**
 * @package Codepub Meta box
 * @version 1.0
 */
/*
Plugin Name: Codepub Meta box
Plugin URI: https://ncube.net/
Description: This plugin add custom meta box.
Author: chicpro
Version: 1.0
Author URI: https://ncube.net/
*/

// meta box render
function codepub_meta_box($post)
{
    wp_nonce_field( basename( __FILE__ ), 'codepub_meta_box_nonce' );

    $codepub_meta_box_value = (int)get_post_meta($post->ID, 'codepub_meta_box_value', true);

    echo '<div>'.PHP_EOL;
    echo '<p>'.PHP_EOL;
    echo '<input type="checkbox" name="codepub_meta_box_value" id="codepub_meta_box_value" value="1"'.($codepub_meta_box_value ? ' checked="checked"' : '').'>'.PHP_EOL;
    echo '<label for="codepub_meta_box_value">메타박스</label>'.PHP_EOL;
    echo '</p>'.PHP_EOL;
    echo '</div>'.PHP_EOL;
}

function add_codepub_meta_box()
{
    foreach (array('post', 'page') as $post_type)
        add_meta_box( 'codepub_meta_box', __( 'Codepub 메타박스', 'codepub_meta_box' ), 'codepub_meta_box', $post_type, 'side', 'low' );
}

// Save meta value
function save_codepub_meta_box_data($post_id)
{
    if ( !isset( $_POST['codepub_meta_box_nonce'] ) || !wp_verify_nonce( $_POST['codepub_meta_box_nonce'], basename( __FILE__ ) ) ) {
        return;
    }

    // return if autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }

    // Check the user's permissions.
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }

    if ( isset( $_REQUEST['codepub_meta_box_value'] ) ) {
        update_post_meta( $post_id, 'codepub_meta_box_value', sanitize_text_field( $_POST['codepub_meta_box_value'] ) );
    } else {
        // delete data
        delete_post_meta( $post_id, 'codepub_meta_box_value' );
    }
}

add_action( 'admin_init', 'add_codepub_meta_box' );
add_action( 'save_post',  'save_codepub_meta_box_data' );

33 라인의 array('post', 'page') 에서 워드프레스 포스트 타입이 postpage인 경우에만 메타박스가 출력된다. 메타박스 디자인 부분과 데이터를 저장하는 부분이 포함되어 있다.

[PHP] 문자열에 포함된 다수의 특정 문자를 순차적으로 치환하기

문자열에 포함된 동일한 다수의 특정 문자를 순차적으로 치환하는 방법이다. 순차적으로 치환한다는 것의 의미가 불분명할 수 있는데.. 예를 들면 이런 것이다. a b a c d 문자열에서 a 를  a_1 b a_2 c d 로 치환하는 것이다. 설명을 자세히 할 능력이 없기 때문에 코드를 보자.

<?php
$string = 'test [form] string with [form] replace';

$form = '[ id : id_{{idx}} ]';

function replaceForm($form) {
    static $idx = 0;

    $idx++;

    return str_replace('{{idx}}', $idx, $form);
}

echo preg_replace_callback('#\[form\]#',
        function($match) use ($form) {
            return replaceForm($form);
        },
        $string);

위 코드는 문자열에 포함된 [form] 문자를 [ id : id_1 ] 과 같은 형식으로 치환하여 출력한다. 결과는 아래와 같다.

test [ id : id_1 ] string with [ id : id_2 ] replace

참고 : http://www.php.net/manual/en/function.preg-replace-callback.php

위의 예제를 수정하여 동일한 웹페이지에 다수의 [form] 문자열을 입력폼으로 치환하여 출력할 때 입력 필드의 id와 label의 for 를 각각 매치시켜줄 때 사용할 수 있다.

ssh 접속 세션 유지하기

우분투 환경에서만 그러는지 모르겠지만 터미널에서 ssh 접속 후 일정 시간이 지나면 ssh 접속이 프리징 상태가 되어 터미널을 종료해야 하는 경우가 종종 발생한다. 일정 시간이상 명령어 입력 등의 활동이 없어서 접속이 끊어진 것으로 생각이 되는데.. 이럴 때는 일정 시간마다 null packet을 전송해서 접속을 유지시켜주면 된다.

.ssh/config 파일에 아래 내용을 추가한다.

Host *
  ServerAliveInterval 60

위 설정은 60초 마다 null packet 을 전송한다.

참고 : https://unix.stackexchange.com/a/200256

카카오 번역 API 사용을 위한 PHP 클라이언트

카카오 번역 API 사용을 위한 PHP 클라이언트 코드이다. PHP 7.0 이상의 환경에서 사용할 수 있다.

카카오 번역 API : https://developers.kakao.com/docs/restapi/translation

<?php
/**
* @author chicpro <chicpro@gmail.com>
* @copyright (c) chicpro
* @link https://ncube.net
*/

namespace chicpro\KAKAO;

class TRANSLATE
{
    protected $host;
    protected $appKey;

    protected $query;
    protected $sourceLanguage;
    protected $targetLanguage;

    public function __construct(string $appKey = '')
    {
        $this->host   = 'https://kapi.kakao.com/v1/translation/translate';
        $this->appKey = $appKey;
    }

    public function setHost(string $host)
    {
        $this->host = $host;
    }

    public function setAppKey(string $appKey)
    {
        $this->appKey = $appKey;
    }

    public function setQuery(string $query)
    {
        $this->query = $query;
    }

    public function setSourceLanguage(string $source)
    {
        $this->sourceLanguage = $source;
    }

    public function setTargetLanguage(string $target)
    {
        $this->targetLanguage = $target;
    }

    public function sendRequest()
    {
        $headers = array(
            'Authorization: KakaoAK ' . $this->appKey
        );

        $postData = [
            'src_lang'    => $this->sourceLanguage,
            'target_lang' => $this->targetLanguage,
            'query'       => $this->query
        ];

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_URL, $this->host);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));

        $json = curl_exec($ch);

        if ($errno = curl_errno($ch)) {
            $result = new \stdClass;
            $result->errno = $errno;
            $result->error = 'Curl error: ' . curl_error($ch);
        } else {
            $response = json_decode($json);
            $result = $response;
        }

        return $result;
    }
}

카카오 번역 API 예제 코드는 아래와 같다. Read More