Don't send posts to social media multiple times
Check if a post has previously been sent to social media, by checking the value of a `field_sent_to_social_media` field. This field is hidden on the node add/edit forms, and populated when a post is sent to social media. Once this happens, it will not be sent to social media again. This change also populates the field for all existing posts, so that they won't be re-sent to social media either.
This commit is contained in:
parent
8761f9c4cc
commit
8385d6fef7
|
@ -7,6 +7,7 @@ dependencies:
|
||||||
- field.field.node.post.field_excerpt
|
- field.field.node.post.field_excerpt
|
||||||
- field.field.node.post.field_has_tweet
|
- field.field.node.post.field_has_tweet
|
||||||
- field.field.node.post.field_images
|
- field.field.node.post.field_images
|
||||||
|
- field.field.node.post.field_sent_to_social_media
|
||||||
- field.field.node.post.field_series
|
- field.field.node.post.field_series
|
||||||
- field.field.node.post.field_tags
|
- field.field.node.post.field_tags
|
||||||
- node.type.post
|
- node.type.post
|
||||||
|
@ -127,4 +128,5 @@ content:
|
||||||
region: content
|
region: content
|
||||||
settings: { }
|
settings: { }
|
||||||
third_party_settings: { }
|
third_party_settings: { }
|
||||||
hidden: { }
|
hidden:
|
||||||
|
field_sent_to_social_media: true
|
||||||
|
|
|
@ -7,6 +7,7 @@ dependencies:
|
||||||
- field.field.node.post.field_excerpt
|
- field.field.node.post.field_excerpt
|
||||||
- field.field.node.post.field_has_tweet
|
- field.field.node.post.field_has_tweet
|
||||||
- field.field.node.post.field_images
|
- field.field.node.post.field_images
|
||||||
|
- field.field.node.post.field_sent_to_social_media
|
||||||
- field.field.node.post.field_series
|
- field.field.node.post.field_series
|
||||||
- field.field.node.post.field_tags
|
- field.field.node.post.field_tags
|
||||||
- node.type.post
|
- node.type.post
|
||||||
|
@ -25,6 +26,16 @@ content:
|
||||||
settings: { }
|
settings: { }
|
||||||
third_party_settings: { }
|
third_party_settings: { }
|
||||||
region: content
|
region: content
|
||||||
|
field_sent_to_social_media:
|
||||||
|
weight: 3
|
||||||
|
label: above
|
||||||
|
settings:
|
||||||
|
format: default
|
||||||
|
format_custom_false: ''
|
||||||
|
format_custom_true: ''
|
||||||
|
third_party_settings: { }
|
||||||
|
type: boolean
|
||||||
|
region: content
|
||||||
field_tags:
|
field_tags:
|
||||||
weight: 2
|
weight: 2
|
||||||
label: above
|
label: above
|
||||||
|
|
|
@ -8,6 +8,7 @@ dependencies:
|
||||||
- field.field.node.post.field_excerpt
|
- field.field.node.post.field_excerpt
|
||||||
- field.field.node.post.field_has_tweet
|
- field.field.node.post.field_has_tweet
|
||||||
- field.field.node.post.field_images
|
- field.field.node.post.field_images
|
||||||
|
- field.field.node.post.field_sent_to_social_media
|
||||||
- field.field.node.post.field_series
|
- field.field.node.post.field_series
|
||||||
- field.field.node.post.field_tags
|
- field.field.node.post.field_tags
|
||||||
- node.type.post
|
- node.type.post
|
||||||
|
@ -34,5 +35,6 @@ hidden:
|
||||||
body: true
|
body: true
|
||||||
field_has_tweet: true
|
field_has_tweet: true
|
||||||
field_images: true
|
field_images: true
|
||||||
|
field_sent_to_social_media: true
|
||||||
field_series: true
|
field_series: true
|
||||||
field_tags: true
|
field_tags: true
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
uuid: 4f639dd0-6634-43ea-89a8-141dfde87059
|
||||||
|
langcode: en
|
||||||
|
status: true
|
||||||
|
dependencies:
|
||||||
|
config:
|
||||||
|
- field.storage.node.field_sent_to_social_media
|
||||||
|
- node.type.post
|
||||||
|
id: node.post.field_sent_to_social_media
|
||||||
|
field_name: field_sent_to_social_media
|
||||||
|
entity_type: node
|
||||||
|
bundle: post
|
||||||
|
label: 'Sent to social media'
|
||||||
|
description: ''
|
||||||
|
required: false
|
||||||
|
translatable: false
|
||||||
|
default_value:
|
||||||
|
-
|
||||||
|
value: 0
|
||||||
|
default_value_callback: ''
|
||||||
|
settings:
|
||||||
|
on_label: 'On'
|
||||||
|
off_label: 'Off'
|
||||||
|
field_type: boolean
|
|
@ -0,0 +1,18 @@
|
||||||
|
uuid: 2fead662-4d91-4788-b739-8e1a56d236af
|
||||||
|
langcode: en
|
||||||
|
status: true
|
||||||
|
dependencies:
|
||||||
|
module:
|
||||||
|
- node
|
||||||
|
id: node.field_sent_to_social_media
|
||||||
|
field_name: field_sent_to_social_media
|
||||||
|
entity_type: node
|
||||||
|
type: boolean
|
||||||
|
settings: { }
|
||||||
|
module: core
|
||||||
|
locked: false
|
||||||
|
cardinality: 1
|
||||||
|
translatable: true
|
||||||
|
indexes: { }
|
||||||
|
persist_with_no_fields: false
|
||||||
|
custom_storage: false
|
17
web/modules/custom/custom/custom.install
Normal file
17
web/modules/custom/custom/custom.install
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Drupal\custom\Repository\PostRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark existing blog posts as sent to social media.
|
||||||
|
*/
|
||||||
|
function custom_update_8001(): void {
|
||||||
|
$posts = \Drupal::service(PostRepository::class)->getAll();
|
||||||
|
|
||||||
|
foreach ($posts as $post) {
|
||||||
|
$post->set('field_sent_to_social_media', TRUE);
|
||||||
|
$post->save();
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,5 +7,8 @@ services:
|
||||||
tags:
|
tags:
|
||||||
- { name: event_subscriber }
|
- { name: event_subscriber }
|
||||||
|
|
||||||
|
Drupal\custom\Repository\PostRepository:
|
||||||
|
autowire: true
|
||||||
|
|
||||||
Drupal\custom\Service\TalkCounter:
|
Drupal\custom\Service\TalkCounter:
|
||||||
autowire: true
|
autowire: true
|
||||||
|
|
|
@ -18,6 +18,10 @@ use Drupal\node\Entity\Node;
|
||||||
*/
|
*/
|
||||||
class Post extends Node implements ContentEntityBundleInterface {
|
class Post extends Node implements ContentEntityBundleInterface {
|
||||||
|
|
||||||
|
public function hasBeenSentToSocialMedia(): bool {
|
||||||
|
return (bool) $this->get('field_sent_to_social_media')->getString();
|
||||||
|
}
|
||||||
|
|
||||||
public function hasTweet(): bool {
|
public function hasTweet(): bool {
|
||||||
return (bool) $this->get('field_has_tweet')->getString();
|
return (bool) $this->get('field_has_tweet')->getString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,10 @@ final class PushBlogPostToSocialMedia implements EventSubscriberInterface {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Check that the post has not already been pushed.
|
// If this post has already been sent to social media, do not send it again.
|
||||||
|
if ($entity->hasBeenSentToSocialMedia()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$url = \Drupal::configFactory()->get('opdavies_talks.config')
|
$url = \Drupal::configFactory()->get('opdavies_talks.config')
|
||||||
->get('zapier_post_tweet_url');
|
->get('zapier_post_tweet_url');
|
||||||
|
@ -47,6 +50,8 @@ final class PushBlogPostToSocialMedia implements EventSubscriberInterface {
|
||||||
'message' => $entity->toTweet(),
|
'message' => $entity->toTweet(),
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$entity->set('field_sent_to_social_media', TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
27
web/modules/custom/custom/src/Repository/PostRepository.php
Normal file
27
web/modules/custom/custom/src/Repository/PostRepository.php
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Drupal\custom\Repository;
|
||||||
|
|
||||||
|
use Drupal\Core\Entity\EntityStorageInterface;
|
||||||
|
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
|
||||||
|
final class PostRepository {
|
||||||
|
|
||||||
|
private EntityStorageInterface $nodeStorage;
|
||||||
|
|
||||||
|
public function __construct(EntityTypeManagerInterface $entityTypeManager) {
|
||||||
|
$this->nodeStorage = $entityTypeManager->getStorage('node');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAll(): Collection {
|
||||||
|
return new Collection(
|
||||||
|
$this->nodeStorage->loadByProperties([
|
||||||
|
'type' => 'post',
|
||||||
|
])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue