У меня есть веб-сайт, который использует 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 и просто нажимаю «Обновить», поля являются абсолютно правильными.
Также работает крючок для удаления шорткодов из контента.
Как я могу исправить эту проблему? Кроме того, что-то не так / глупо с тем, как я решил это сделать? Будет ли какой-то другой способ быть чище / проще / быстрее и т.д.?
Спасибо за ваше время
Я делал это несколько раз, и вот как я это делаю.
Сначала я создаю функцию, которая будет отображать галерею так, как я хочу. Вы можете изменить это в соответствии с тем, как вы хотите, чтобы ваша разметка галереи была:
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 выше, но у вас будет больше гибкости в отношении того, где вы выводите и размещаете галерею на странице.
Я надеюсь, что это поможет любому, кто хочет сделать то же самое.
Других решений пока нет …