Skip to content

Commit

Permalink
Merge pull request #946 from Codeinwp/fix/feed-image-on-chained-actions
Browse files Browse the repository at this point in the history
fix: feed image when using chained actions
  • Loading branch information
Soare-Robert-Daniel authored Jun 6, 2024
2 parents c54664c + 982c5ab commit 19a96af
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 37 deletions.
40 changes: 20 additions & 20 deletions includes/admin/feedzy-rss-feeds-import.php
Original file line number Diff line number Diff line change
Expand Up @@ -1663,20 +1663,20 @@ private function run_job( $job, $max ) {
$image_source_url = '';
$img_success = true;
$new_post_id = 0;
$default_img_tag = ! empty( $import_featured_img ) && is_string( $import_featured_img ) ? $import_featured_img : '';
$feed_img_tag = ! empty( $import_featured_img ) && is_string( $import_featured_img ) ? $import_featured_img : '';

// image tag
if ( strpos( $default_img_tag, '[#item_image]' ) !== false ) {
if ( strpos( $feed_img_tag, '[#item_image]' ) !== false ) {
// image exists in item
if ( ! empty( $item['item_img_path'] ) ) {
$image_source_url = str_replace( '[#item_image]', $item['item_img_path'], $default_img_tag );
$image_source_url = str_replace( '[#item_image]', $item['item_img_path'], $feed_img_tag );
} else {
$img_success = false;
}
} elseif ( strpos( $default_img_tag, '[#item_custom' ) !== false ) {
} elseif ( strpos( $feed_img_tag, '[#item_custom' ) !== false ) {
// custom image tag
if ( $this->feedzy_is_business() || $this->feedzy_is_personal() ) {
$value = apply_filters( 'feedzy_parse_custom_tags', $default_img_tag, $item_obj );
$value = apply_filters( 'feedzy_parse_custom_tags', $feed_img_tag, $item_obj );
}

if ( ! empty( $value ) && strpos( $value, '[#item_custom' ) === false ) {
Expand All @@ -1685,7 +1685,7 @@ private function run_job( $job, $max ) {
$img_success = false;
}
} else {
$image_source_url = $default_img_tag;
$image_source_url = $feed_img_tag;
}

if ( ! empty( $image_source_url ) ) {
Expand Down Expand Up @@ -1770,24 +1770,24 @@ function( $term ) {

do_action( 'feedzy_import_extra', $job, $item_obj, $new_post_id, $import_errors, $import_info );

$default_img_tag = ! empty( $import_featured_img ) && is_string( $import_featured_img ) ? $import_featured_img : '';
if ( ! empty( $default_img_tag ) && 'attachment' !== $import_post_type ) {
if ( ! empty( $import_featured_img ) && 'attachment' !== $import_post_type ) {
$image_source_url = '';
$img_success = true;

// image tag
if ( strpos( $default_img_tag, '[#item_image]' ) !== false ) {
// image exists in item
if ( ! empty( $item['item_img_path'] ) ) {
$image_source_url = str_replace( '[#item_image]', $item['item_img_path'], $default_img_tag );
$feed_img_tag = false === strpos( $import_featured_img, '[[{"value":' ) ? $import_featured_img : '[#item_image]'; // Use feed default image when we are using chained actions.

// Set the feed image as default value for the image source.
if ( strpos( $feed_img_tag, '[#item_image]' ) !== false ) {
if ( ! empty( $item['item_img_path'] ) ) { // image exists in item
$image_source_url = str_replace( '[#item_image]', $item['item_img_path'], $feed_img_tag );
} else {
$img_success = false;
}
} elseif ( strpos( $default_img_tag, '[#item_custom' ) !== false ) {
// custom image tag
if ( $this->feedzy_is_business() || $this->feedzy_is_personal() ) {
$value = apply_filters( 'feedzy_parse_custom_tags', $default_img_tag, $item_obj );
}
} elseif (
( $this->feedzy_is_business() || $this->feedzy_is_personal() ) && // PRO feature.
false !== strpos( $feed_img_tag, '[#item_custom' )
) {
$value = apply_filters( 'feedzy_parse_custom_tags', $feed_img_tag, $item_obj ); // custom image tag
if ( ! empty( $value ) && strpos( $value, '[#item_custom' ) === false ) {
$image_source_url = $value;
} else {
Expand Down Expand Up @@ -1840,12 +1840,12 @@ function( $term ) {
}

if ( 'yes' === $import_item_img_url || ! $this->tryReuseExistingFeaturedImage( $img_success, $item['item_title'], $new_post_id ) ) {
// Item image action.
// Run chained actions.
$import_featured_img = rawurldecode( $import_featured_img );
$import_featured_img = trim( $import_featured_img );
$img_action = $this->get_actions_runner( $import_featured_img, 'item_image' );
// Item image action process.
$image_source_url = $img_action->run_action_job( $import_featured_img, $import_translation_lang, $job, $language_code, $item, $image_source_url );
$image_source_url = $img_action->run_action_job( $img_action->get_serialized_actions(), $import_translation_lang, $job, $language_code, $item, $image_source_url );

if ( ! empty( $image_source_url ) ) {
if ( 'yes' === $import_item_img_url ) {
Expand Down
65 changes: 48 additions & 17 deletions tests/e2e/specs/import.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,12 @@ import {
addFeeds,
runFeedImport,
addFeaturedImage,
addContentMapping
addContentMapping,
getEmptyChainedActions,
serializeChainedActions,
wrapSerializedChainedActions,
setItemLimit,
getPostsByFeedzy
} from '../utils';

test.describe( 'Feed Import', () => {
Expand Down Expand Up @@ -41,7 +46,7 @@ test.describe( 'Feed Import', () => {
});

test( 'import lazy loading feeds with shortcode', async({ editor, page, admin }) => {
const lazyShortcode = "[feedzy-rss feeds='https://s3.amazonaws.com/verti-utils/sample-feed.xml' max='11' offset='1' feed_title='yes' refresh='1_hours' meta='yes' multiple_meta='yes' summary='yes' price='yes' mapping='price=im:price' thumb='yes' keywords_title='God, Mendes, Cyrus, Taylor' keywords_ban='Cyrus' template='style1' lazy='yes']";
const lazyShortcode = "[feedzy-rss feeds='https://s3.amazonaws.com/verti-utils/sample-feed.xml' max='2' offset='1' feed_title='yes' refresh='1_hours' meta='yes' multiple_meta='yes' summary='yes' price='yes' mapping='price=im:price' thumb='yes' keywords_title='God, Mendes, Cyrus, Taylor' keywords_ban='Cyrus' template='style1' lazy='yes']";

await admin.createNewPost();

Expand All @@ -63,7 +68,7 @@ test.describe( 'Feed Import', () => {
} );

test( 'import multiple feeds with shortcode', async({ editor, page, admin }) => {
const multipleFeedsShortCode = "[feedzy-rss feeds='https://s3.amazonaws.com/verti-utils/sample-feed-multiple1.xml, https://s3.amazonaws.com/verti-utils/sample-feed-multiple2.xml' max='10' feed_title='no' refresh='1_hours' meta='yes' multiple_meta='yes' summary='yes' thumb='yes' template='style1']";
const multipleFeedsShortCode = "[feedzy-rss feeds='https://s3.amazonaws.com/verti-utils/sample-feed-multiple1.xml, https://s3.amazonaws.com/verti-utils/sample-feed-multiple2.xml' max='1' feed_title='no' refresh='1_hours' meta='yes' multiple_meta='yes' summary='yes' thumb='yes' template='style1']";

await admin.createNewPost();

Expand Down Expand Up @@ -114,6 +119,7 @@ test.describe( 'Feed Import', () => {

await page.getByPlaceholder('Add a name for your import').fill(importName);
await addFeeds( page, [FEED_URL] );
await setItemLimit(page, 1);
await page.getByRole('button', { name: 'Save & Activate importing' }).click({ force: true });

await runFeedImport( page );
Expand All @@ -130,6 +136,7 @@ test.describe( 'Feed Import', () => {
await page.getByPlaceholder('Add a name for your import').fill(importName);
await addFeeds( page, [FEED_URL] );
await addFeaturedImage( page, '[#item_image]' );
await setItemLimit(page, 1);
await page.getByRole('button', { name: 'Save & Activate importing' }).click({ force: true });

await runFeedImport( page );
Expand All @@ -141,7 +148,7 @@ test.describe( 'Feed Import', () => {
await expect( page.getByLabel('Edit or replace the image') ).toBeVisible(); // Featured image is added.
});

test( 'importing feed with chained actions', async({ admin, page }) => {
test( 'importing feed with chained actions', async({ admin, page, requestUtils }) => {
await admin.createNewPost();

const importName = 'Test Title: importing feed from URL with featured image';
Expand All @@ -151,26 +158,50 @@ test.describe( 'Feed Import', () => {

await page.getByPlaceholder('Add a name for your import').fill(importName);
await addFeeds( page, [FEED_URL] );
await addContentMapping( page, '[[{"value":"%5B%7B%22id%22%3A%22trim%22%2C%22tag%22%3A%22item_content%22%2C%22data%22%3A%7B%22trimLength%22%3A%2230%22%7D%7D%5D"}]] '); // Trim the content with 30 words max.
await addFeaturedImage( page, '[[{"value":"%5B%7B%22id%22%3A%22%22%2C%22tag%22%3A%22item_image%22%2C%22data%22%3A%7B%7D%7D%5D"}]] ' );
await addContentMapping( page, wrapSerializedChainedActions( serializeChainedActions( [
{
"id": "trim",
"tag": "item_content",
"data": {
"trimLength": "30"
}
}
] ) ) );
await addFeaturedImage( page, getEmptyChainedActions( 'item_image' ) );
await setItemLimit(page, 1);

await page.getByRole('button', { name: 'Save & Activate importing' }).click({ force: true });

await runFeedImport( page );
const posts = await getPostsByFeedzy( requestUtils );

// Select the first post created by feeds import. Check the featured image.
await page.getByRole('link', { name: 'Posts', exact: true }).click({ force: true });
await page.locator('#the-list tr').first().locator('a.row-title').click({ force: true });
for ( const post of posts ) {
expect( post.featured_media ).toBeGreaterThan(0);
expect( post.content.rendered.split(' ').length ).toBeLessThanOrEqual(30);
}
});

test( 'image gallery for feeds imported with featured image chained actions', async({ admin, page }) => {
await admin.createNewPost();

const importName = 'Test Title: image gallery for feeds imported with featured image chained actions';

await page.goto('/wp-admin/post-new.php?post_type=feedzy_imports');
await tryCloseTourModal( page );

await page.getByPlaceholder('Add a name for your import').fill(importName);
await addFeeds( page, [FEED_URL] );
await addFeaturedImage( page, getEmptyChainedActions( 'item_image' ) );

await page.getByRole('button', { name: 'Save & Activate importing' }).click({ force: true });

await expect( page.getByLabel('Add title') ).toBeVisible(); // Post title.
await page.goto('/wp-admin/edit.php?post_type=feedzy_imports');

// Content should be trimmed to 30 words.
const content = await page.getByPlaceholder('Write HTML…').inputValue();
expect( content ).toContain('<p>');
expect( content.split(' ').length ).toBeLessThanOrEqual(30);
await runFeedImport( page );

// Enable this test for https://github.com/Codeinwp/feedzy-rss-feeds/pull/946 when the PR is merged.
// await page.getByRole('button', { name: 'Featured image' }).click({ force: true });
// await expect( page.getByLabel('Edit or replace the image') ).toBeVisible(); // Featured image is added.
// All the imported image should be available in the media library.
await page.goto('/wp-admin/upload.php');
await page.waitForSelector('#wp-media-grid');
await expect( page.locator('.attachment').count() ).resolves.toBeGreaterThan(0); // We should have some imported images.
});
});
57 changes: 57 additions & 0 deletions tests/e2e/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,45 @@ export async function addContentMapping( page, mapping ) {
}, mapping );
}

/**
* Set the item limit on the Feed Edit page.
* @param {import('playwright').Page} page The page object.
* @param {number} limit The limit to set.
* @returns {Promise<void>}
*/
export async function setItemLimit( page, limit ) {
await page.evaluate( ( limit ) => {
document.querySelector( 'input[name="feedzy_meta_data[import_feed_limit]"]' ).value = limit;
} , limit );
}

/**
* Create an empty chained actions.
* @param {string} defaultFeedTag The default feed tag.
* @returns {string} The empty chained actions.
*/
export function getEmptyChainedActions( defaultFeedTag ) {
return wrapSerializedChainedActions(serializeChainedActions([ { id: '', tag: defaultFeedTag, data: {} } ] ) );
}

/**
* Serialize the chained actions.
* @param {any[]} actions The actions to serialize.
* @returns {string} The serialized actions.
*/
export function serializeChainedActions( actions ) {
return encodeURIComponent( JSON.stringify( actions ) );
}

/**
* Wrap the serialized chained actions to match the format used in the input.
* @param {string} actions The serialized actions.
* @returns {string} The wrapped actions.
*/
export function wrapSerializedChainedActions( actions ) {
return `[[{"value":"${actions}"}]]`;
}

/**
* Run the feed import.
*
Expand Down Expand Up @@ -120,3 +159,21 @@ export async function deleteAllFeedImports( requestUtils ) {
)
);
}

/**
* Get post created with Feedzy.
* @param {RequestUtils} requestUtils The request utils object.
* @returns {Promise<*>}
*/
export async function getPostsByFeedzy( requestUtils ) {
return await requestUtils.rest({
path: '/wp/v2/posts',
params: {
per_page: 100,
status: 'publish',
meta_key: 'feedzy',
meta_value: 1,
meta_compare: '=',
},
});
}

0 comments on commit 19a96af

Please sign in to comment.