Как отделить галерею от контента в WordPress?

Что я хочу сделать

У меня есть веб-сайт, который использует CMS, которую я написал некоторое время назад, и сейчас я пытаюсь перенести ее в WordPress.

В существующей реализации, когда кто-то пишет сообщение, он может добавить несколько дополнительных изображений, которые отображаются в виде галереи в конце сообщения, как вы можете видеть на этой странице, например (извините за неанглийскую страницу): http://apollonpatras.gr/news/562/i-bradia-ton-xorigon-parousiasi-xorigikou-programmatos-kai-eisitirion-diarkeias/.

Как я думаю, я могу это сделать

Я подумываю о том, чтобы позволить пользователям создавать галереи WordPress и, при сохранении времени поста, перехватывать содержимое поста и сохранять идентификаторы изображений галереи в поле постмета, чтобы я мог показывать их так, как мне хочется.

Кроме того, мне придется убрать галереи из контента, прежде чем они будут показаны, так как я покажу их по-своему позже.

Что я пытаюсь до сих пор

add_filter('content_save_pre', 'intercept_galleries', 99);
function intercept_galleries($content) {
if (get_post_type() !== 'post') {
return $content;
}

if (has_shortcode($content, 'gallery')) {
// The  short code exists.
$a = get_post_gallery(0, false);
update_post_meta(get_the_ID(), 'has_gallery', 1);
update_post_meta(get_the_ID(), 'gallery_items', $a['ids']);
} else {
update_post_meta(get_the_ID(), 'has_gallery', 0);
update_post_meta(get_the_ID(), 'gallery_items', "");
}
return $content;
}

add_filter('the_content', 'remove_shortcodes_from_content');
function remove_shortcodes_from_content($content) {
return strip_shortcodes($content);
}

Где это идет не так

Похоже, что когда сообщение было первоначально сохранено, поле postmeta «has_gallery» имеет значение 1, но поле «gallery_items» пусто.

Когда я захожу в редактор WordPress и просто нажимаю «Обновить», поля являются абсолютно правильными.

Также работает крючок для удаления шорткодов из контента.

Что я ищу

Как я могу исправить эту проблему? Кроме того, что-то не так / глупо с тем, как я решил это сделать? Будет ли какой-то другой способ быть чище / проще / быстрее и т.д.?

Спасибо за ваше время

1

Решение

Я делал это несколько раз, и вот как я это делаю.

Сначала я создаю функцию, которая будет отображать галерею так, как я хочу. Вы можете изменить это в соответствии с тем, как вы хотите, чтобы ваша разметка галереи была:

function my_gallery_shortcode( $attr ) {

$post = get_post();
if ( ! empty( $attr['ids'] ) ) {
$attr['include'] = $attr['ids'];
}

extract( shortcode_atts( array(
'order'      => 'ASC',
'orderby'    => 'post__in',
'id'         => $post->ID,
'columns'    => 3,
'size'       => 'large',
'include'    => '',
), $attr));

$id = (int) $id;
$columns = (int) $columns;

if ( 'RAND' == $order ) {
$orderby = 'none';
}

if ( ! empty( $include ) ) {
$_attachments = get_posts( array( 'include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby ) );
$attachments = array();
foreach ( $_attachments as $key => $val ) {
$attachments[$val->ID] = $_attachments[$key];
}
}

if ( empty( $attachments ) ) {
return '';
}

$output = '<div class="slideshow"><ul>';

foreach ( $attachments as $id => $attachment ) {
$thumb = wp_get_attachment_image_src( $id, 'large', false );

$output .= '<li><img src="' . $thumb[0] . '" width="' . $thumb[1] . '" height="' . $thumb[2] . '" alt="' . get_post_meta( $id, '_wp_attachment_image_alt', true ) . '" /></li>';
}

$output .= '</ul></div>';
return $output;
}

Вы можете усложнить или просто выполнить вышеуказанную функцию в соответствии с вашими требованиями.

Тогда в вашей теме functions.php Добавь это:

add_shortcode( 'gallery', 'my_gallery_shortcode' );

Теперь у вас есть два варианта:

1) Вы можете разрешить своему пользователю добавлять галерею к содержанию главной страницы, редактируя соответствующую страницу и переходя к Media > Create Gallery

Это вставит короткий код галереи, который будет отформатирован в соответствии с вашей функцией my_gallery_shortcode()однако галереей можно управлять с помощью функциональности галереи WordPress в административной области, и WordPress хранит ее в базе данных обычным способом.

или же

2) Вы можете создать отдельное поле WYSIWYG либо с помощью дополнительного кода в вашем functions.php файл или с помощью плагина, такого как Расширенные пользовательские поля. Затем вы должны использовать это дополнительное поле WYSIWYG, чтобы позволить пользователю вставлять шорткод галереи так же, как указано выше. Это практически то же самое, что и вариант 1 выше, но у вас будет больше гибкости в отношении того, где вы выводите и размещаете галерею на странице.

Я надеюсь, что это поможет любому, кто хочет сделать то же самое.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]