분할 컨텐츠 및 갤러리


22

게시물 내용과 갤러리 단축 코드를 분할하는 방법이 있습니까? 방법이나 위치에 상관없이 일반 컨텐츠 외부에 갤러리를 표시하고 싶습니다. 이것을 사용하여 단축 코드 자체를 얻을 수 있습니다.

if(has_shortcode(get_the_content(), 'gallery')){
    $pattern = get_shortcode_regex(); 
    preg_match("/$pattern/s", get_the_content(), $matches);
    echo do_shortcode($matches[0]);
}

그러나 갤러리 짧은 코드가 첫 번째 인스턴스가 아닌 경우 작동하지 않습니다. 내 콘텐츠를 분할하고 갤러리를 완전히 분할하는 방법이 있습니까?


편집 : 나는 반 솔루션을 가지고 있지만 그것에 대해 갈 길이 멀다. 먼저 게시물의 첫 번째 단축 코드를 가져옵니다 ( "갤러리"단축 코드 만 원하므로 수정해야 함). 그런 다음 내용에서 모든 단축 코드를 제거합니다 (실제로하고 싶은 것은 아닙니다).

<?php if(has_shortcode(get_the_content(), 'gallery')) : ?>
    <?php 
        $pattern = get_shortcode_regex(); 
        preg_match("/$pattern/s", get_the_content(), $matches);
    ?>
    <div id="content">
        <?php echo strip_shortcodes(get_the_content()); ?>
    </div>
    <div id="gallery">
        <?php echo do_shortcode($matches[0]); ?>
    </div>
<?php endif; ?>

편집 # 2- 좋아, 게시물에 갤러리 단축 코드 만 가져올 수있었습니다. 또한 갤러리 단축 코드 형식을 제거하기위한 필터를 추가했습니다 the_content(). 문제는 단축 코드를 게시 한 이후 반드시 제거 할 필요는 없지만 "do_shortcode ()"를 실행할 수 없다는 것입니다.

Functions.php

function remove_gallery($content) {
    global $post;

    if($post->post_type == 'artcpt')
        remove_shortcode('gallery', $content);

    return $content;
}
add_filter( 'the_content', 'remove_gallery', 6); 

루프

<?php preg_match('/\[gallery ids=[^\]]+\]/', get_the_content(), $matches); ?>
<div id="content">
    <?php the_content(); ?>
</div>
<div id="gallery">
    <?php echo do_shortcode($matches[0]); ?>
</div>

The Loop에서 내 짧은 코드를 두 번 반환 합니다 (단일 페이지에 두 번 반복되어야하므로 do_shortcode ()가 실행되지 않습니다). 이유가 확실하지 않습니다.


1
갤러리 전용 WYSYWIG 메타 박스를 추가하는 것을 고려 했습니까? 그런 다음 항상 그 후에 전화 할 수 the_content()있습니다. 그러나 이와 같은 페이지가 이미 많으면 까다 롭습니다.
GhostToast

나는 그것이 가능하다는 데 동의하지만, 또 다른 큰 편집자의 필요성을 피하려고 노력했습니다. 가능한 한 간단하고 직선적으로 만들려고 노력했습니다. (물론 플러그인없이) 갤러리 추가 메타 박스 또는 비슷한 것을 가질 수 있기를 바랍니다.
Howdy_McGee

답변:


24

이것을 단순화 할 수있는 사람에게 열려 있지만 여기에 나와있는 것이 나를 위해 일했습니다.

첫 번째로- get_post_gallery()루프가 시작되는 즉시을 사용하여 갤러리를 가져옵니다 .

<?php if( have_posts() ) : ?>

    <?php while( have_posts() ) :
            the_post();
            $gallery = get_post_gallery();
            $content = strip_shortcode_gallery( get_the_content() );
    ?>

        <div id="content">
            <?php echo $content; ?>
        </div> <!-- id="content" -->

        <div id="gallery">
            <?php echo $gallery; ?>
        </div> <!-- id="gallery" -->

    <?php endwhile; ?>

<?php endif; ?>

strip_shortcode_gallery() 함수-functions.php

function strip_shortcode_gallery( $content ) {
    preg_match_all( '/' . get_shortcode_regex() . '/s', $content, $matches, PREG_SET_ORDER );

    if ( ! empty( $matches ) ) {
        foreach ( $matches as $shortcode ) {
            if ( 'gallery' === $shortcode[2] ) {
                $pos = strpos( $content, $shortcode[0] );
                if( false !== $pos ) {
                    return substr_replace( $content, '', $pos, strlen( $shortcode[0] ) );
                }
            }
        }
    }

    return $content;
}

자원:

스택 오버플로:

내가 원래 벗어난 것은 예상대로 작동하지 않았습니다.


4

핵심 단축 코드 정규식

기본적으로 우리는 Regex를 사용하여이를 수행 할 수 있습니다. 실제로 코어가 제공하는 Regex를 사용하더라도 가능합니다 get_shortcode_regex().

먼저 단축 코드 태그를 잡고 정규식을 작성해야합니다. 핵심 함수는 get_shortcode_regex()슬프게도 인수를 던질 기회를 제공하지 않으므로 각각의 모든 단축 코드와 일치하는 정규 표현식이 남습니다 [gallery]. 단순히 대상을 지정하기를 원하기 때문에 바람직하지 않습니다.

// Get all tags as Array
$tags = $GLOBALS['shortcode_tags'];
// remove the gallery-shortcode; 'gallery' is the key
unset( $tags['gallery'] );
// retrieve all shortcodes (but not 'gallery') separated by a vertical pipe char/the "or" Regex char
$tags = join( '|', array_map(
    'preg_quote',
    array_keys( $GLOBALS['shortcode_tags'] )
) );

모든 갤러리를 잡아라

다음으로 모든 갤러리를 잡는 정규식이 필요합니다. 따라서 preg_match_all()갤러리 단축 코드에 대한 모든 일치 항목을 0색인 이있는 배열로 반환 하므로 나머지는 부분 일치하므로 무시할 수 있습니다.

$pattern = get_shortcode_regex();
preg_match_all( "/$pattern/s", get_the_content(), $galleries );

이제 $galleries[0]갤러리 단축 코드 태그의 배열을 보유합니다.

갤러리가없는 컨텐츠

다음 [gallery]은 콘텐츠에서 모든 단축 코드 를 제거하는 것입니다 . 동일한 정규식을 다시 사용하여 실행합니다 get_the_content(). 물론 the_content렌더링시 콜백을 통해 단축 코드를 추가 할 수 있으므로 필터를 적용합니다 .

$content = preg_replace_callback(
    "/$pattern/s",
    'strip_shortcode_tag',
    apply_filters( 'the_content', get_the_content() )
);

$content변수는 지금 우리의 콘텐츠를 보유하고 있습니다.

내용을 변경하기위한 콜백 예

또는 : 콘텐츠를 갤러리와 나머지 게시물로 나누는 방법

콜백 중에 컨텐츠를 새 컨텐츠로 쉽게 바꿀 수 있습니다.

$tags = $GLOBALS['shortcode_tags'];
unset( $tags['gallery'] );

$tags = join( '|', array_map(
    'preg_quote',
    array_keys( $GLOBALS['shortcode_tags'] )
) );
$pattern = get_shortcode_regex();

preg_match_all( "/{$pattern}/s", get_the_content(), $galleries );

echo $galleries;
echo "<hr>";
echo preg_replace_callback(
    "/{$pattern}/s",
    'strip_shortcode_tag',
    apply_filters( 'the_content', get_the_content() )
);

먼저 모든 갤러리를 추가 한 다음 수평 규칙으로 구분 된 갤러리없이 콘텐츠를 추가합니다. 이것은 시작에 불과합니다.


wordpress.stackexchange.com/questions/193511/… 과 다른 접근 방식을 사용합니다 . 내가 코드를 시도 할 때 PHP 오류가 발생합니다-살펴보십시오?
Adeerlike

어떤 코드? 무슨 오류? 자세하게 부탁드립니다. 이것은 게임을 추측하는 것이 아니라 개발입니다.
카이저


2

너무 복잡해서는 안됩니다. 아래 코드는 원하는대로 몇 줄로 단축 될 수 있습니다.

접근 방법 1. 갤러리를 포함하여 모든 단축 코드를 포스트 컨텐츠에서 제거하여 깨끗한 포스트 컨텐츠를 얻습니다.

주의 : 다른 모든 단축 코드는 게시물에서 제거됩니다. 사용자 정의 단축 코드를 거기에 배치하지 않으면 접근 방식이 적합합니다.

당신이 WP 루프에 있다고 가정

$ctt = apply_filters('the_content',strip_shortcodes(get_the_content())); // This is your cleaned content
$glry = get_post_gallery(); // and here is the gallery.

당신이 밖으로 있다고 가정

$my_postid = 12;
$my_post = get_post($my_postid);
$ctt = apply_filters('the_content',strip_shortcodes($my_post->post_content));
$glry = get_post_gallery($my_postid);

접근법 2. [gallery]단축 코드 만 제거 하고 다른 모든 단축 코드는 그대로 유지하십시오.

[gallery]WP 팀이 변경 할 수있는 단축 코드의 모양 에 대한 내부 실현에 의존 하므로 첫 번째 접근법만큼 미래의 증거는 아닙니다.

WP 루프에서

$ctt = preg_replace('/\[gallery.*\]/', '', get_the_content());
$ctt = apply_filters('the_content',$ctt); // This is your cleaned content
$glry = get_post_gallery();

그것에서

$my_postid = 12;
$my_post = get_post($my_postid);
$ctt = apply_filters('the_content',preg_replace('/\[gallery.*\]/', '', $my_post->post_content));
$glry = get_post_gallery($my_postid);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.