게시물 제목에서 슬러그 재생


14

게시물 제목을 변경 한 후 프로그래밍 방식으로 슬러그를 재생성 할 수 있습니까? 수많은 게시물 제목이 업데이트되었고 슬러그가 제목으로 업데이트되지 않았으므로이 모든 슬러그를 재생성해야합니다.


이 작업을 여러 번 수행해야 했으므로 다른 서버 환경에서 큰 배열을 처리 할 수없는 (번호 게시물이 무제한으로 설정 됨) 메모리를 많이 사용하여 wp_update_post를 반복적으로 호출하여 페이지 매김을 사용하여 WP_Query 호출로 나누는 것을 발견했습니다. $ wpdb는 더 관리하기 쉽고 성능이 뛰어납니다. 비슷한 게시물에 코드 샘플을 제공했습니다 .
codearachnid

답변:


17

네 가능합니다.

샘플 코드는 다음과 같이 테스트하고 수정해야합니다.

// get all posts
$posts = get_posts( array (  'numberposts' => -1 ) );

foreach ( $posts as $post )
{
    // check the slug and run an update if necessary 
    $new_slug = sanitize_title( $post->post_title );
    if ( $post->post_name != $new_slug )
    {
        wp_update_post(
            array (
                'ID'        => $post->ID,
                'post_name' => $new_slug
            )
        );
    }
}

방금 이것을 만들었습니다. 아마도 약간의 오류와 사례가 있지만 아이디어를 제공해야합니다. 또한 시간이 오래 걸릴 수 있으므로 업데이트를 더 작은 청크로 분할하는 것이 유용 할 수 있습니다.


1
흠 ... 내 경험으로는 작동하지 않습니다. 이 post_name주장은 wp_update_post핵심의 3.9 버전에서
알 수 없다

현재 post_namewp_update_post()함수 내에서 무시 되지만 업데이트 게시물 wp_insert_post()이 함수를 호출 할 때 고려됩니다 . 즉, 새 슬러그를 업데이트로 전달하면 업데이트되는 게시물에 대해 효과적으로 변경됩니다.
Erenor Paz


1

나는 Toscho가 제안한 방법을 시도했는데, 이것은 "명확한 방법"이지만 많은 경우에 작동하지 않습니다 ( "많은 경우"의 의미를 얻는 핵심 코드 참조).

코드를 살펴보면 게시물 iun을 데이터베이스에 삽입하기 직전에 함수가 wp_insert_post_data호출 하는 필터 후크를 발견 wp_update_post했습니다.

이 필터를 호출하고의 값을 변경하여 $data['post_name']올바르게 작동하도록 할 수있었습니다. 워드 프레스는 시원하지만 너무 나쁘게 문서화되었습니다 ...

필요한 경우 더 많은 사람들이이 해결 방법을 찾을 수 있도록 문서를 편집했습니다 .


wp_update_post가 post_name을 덮어 쓰는 이유를 알 수 있습니까? 내가 이런 일이 발생하는 유일한 이유는 post_name을 수정하려는 사용자가 기고자 (또는 동일한 수준) 인 경우 해당 사용자가 슬러그를 변경할 수 없도록해야한다는 것입니다. post_name을 덮어 쓰시겠습니까?
jnhghy-Alexandru Jantea

예, 이것이 올바른 방법입니다. 감사합니다 @Alexandre
user88731

-1

필요한 경우 mysql에서 직접이 작업을 수행 할 수 있습니다. (우리의 woocommerce 사이트에는 수만 개의 제품이 있습니다) :

update wp_posts set post_name = concat(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower(post_title), '"', ''), "'", ''), ",", '-'), " ", '-'), "&", ''), ";", ''), "@", ''), ".", ''), ":", ''), "/", ''), "+", ''), "(", ''), ")", ''), "--", '-'), "---", '-'), "--", '-'), "--", '-'), '-', id) where post_type = 'product';

post_type = 'product'-그냥 woocommerce 제품에 대한 업데이트를 유지합니다. 이 쿼리에 유지하려는 제한을 파악해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.