diff --git a/includes/class-e-reader.php b/includes/class-e-reader.php index c4829aa..d6a51e3 100644 --- a/includes/class-e-reader.php +++ b/includes/class-e-reader.php @@ -152,7 +152,7 @@ protected function get_content( $format, \WP_Post $post ) { $format . '/footer', null, array( - 'url' => get_permalink( $post ), + 'url' => $this->get_post_source_url( $post ), ) ); $content = ob_get_contents(); @@ -161,6 +161,16 @@ protected function get_content( $format, \WP_Post $post ) { return $content; } + /** + * Resolve the source URL for the chapter footer. + * + * @param \WP_Post $post The post. + * @return string + */ + protected function get_post_source_url( \WP_Post $post ) { + return apply_filters( 'send_to_e_reader_post_url', get_permalink( $post ), $post ); + } + /** * Get the date to show for a post in generated e-reader content. * @@ -192,7 +202,7 @@ protected function update_author_name( \WP_Post $post ) { if ( $override_author_name ) { $author_name = $override_author_name; } - $post->author_name = $author_name; + $post->author_name = apply_filters( 'send_to_e_reader_post_author_name', $author_name, $post ); } return $post->author_name; } diff --git a/templates/plain-list.php b/templates/plain-list.php index 83e707a..6cc811c 100644 --- a/templates/plain-list.php +++ b/templates/plain-list.php @@ -313,6 +313,7 @@
post_content ) ) ); ?>
diff --git a/tests/Test_E_Reader.php b/tests/Test_E_Reader.php index 9473f45..c3d6aa2 100644 --- a/tests/Test_E_Reader.php +++ b/tests/Test_E_Reader.php @@ -19,6 +19,8 @@ class Test_E_Reader extends TestCase { public function tearDown(): void { remove_all_filters( 'friends_override_author_name' ); + remove_all_filters( 'send_to_e_reader_post_url' ); + remove_all_filters( 'send_to_e_reader_post_author_name' ); unset( $GLOBALS['_test_upload_basedir'], $GLOBALS['_test_upload_baseurl'] ); parent::tearDown(); } @@ -186,6 +188,38 @@ function () { $this->assertSame( 'Zetaphor', $post->author_name ); } + public function test_chapter_url_and_author_can_be_filtered() { + $post = new \WP_Post(); + $post->ID = 125; + $post->post_author = 1; + $ereader = new E_Reader_Download( 'Test' ); + $url = new \ReflectionMethod( $ereader, 'get_post_source_url' ); + $url->setAccessible( true ); + $this->assertSame( get_permalink( $post ), $url->invoke( $ereader, $post ) ); + add_filter( + 'send_to_e_reader_post_url', + function ( $url, $item ) use ( $post ) { + $this->assertSame( $post, $item ); + return 'https://original.example/article/'; + }, + 10, + 2 + ); + add_filter( + 'send_to_e_reader_post_author_name', + function ( $author, $item ) use ( $post ) { + $this->assertSame( $post, $item ); + return 'Alexander Aidun'; + }, + 10, + 2 + ); + $author = new \ReflectionMethod( $ereader, 'update_author_name' ); + $author->setAccessible( true ); + $this->assertSame( 'Alexander Aidun', $author->invoke( $ereader, $post ) ); + $this->assertSame( 'https://original.example/article/', $url->invoke( $ereader, $post ) ); + } + /** * Test collected article dates replace the saved post date in chapter bylines. */ diff --git a/tests/Test_Send_To_E_Reader.php b/tests/Test_Send_To_E_Reader.php index 04c5927..0a2180d 100644 --- a/tests/Test_Send_To_E_Reader.php +++ b/tests/Test_Send_To_E_Reader.php @@ -20,6 +20,7 @@ class Test_Send_To_E_Reader extends TestCase { public function tearDown(): void { remove_all_filters( 'friends_override_author_name' ); remove_all_filters( 'send_to_e_reader_post_content' ); + remove_all_filters( 'send_to_e_reader_post_url' ); remove_all_filters( 'static_archive_post_types' ); remove_all_filters( 'static_archive_post_html' ); remove_all_filters( 'send_to_e_reader_user_can_send' ); @@ -259,11 +260,23 @@ public function test_plain_list_shows_original_article_date() { 'inputname' => 'epubsecret', ); + add_filter( + 'send_to_e_reader_post_url', + function ( $url, $item ) use ( $post ) { + $this->assertSame( $post, $item ); + return 'https://original.example/article/?a=1&b=2'; + }, + 10, + 2 + ); + ob_start(); include FRIENDS_SEND_TO_E_READER_PLUGIN_DIR . 'templates/plain-list.php'; $output = ob_get_clean(); $this->assertStringContainsString( 'Collected Link', $output ); + $this->assertStringContainsString( 'https://original.example/article/?a=1&b=2', $output ); + $this->assertStringNotContainsString( get_permalink( $post ), $output ); $this->assertStringContainsString( 'June 29, 2026', $output ); $this->assertStringContainsString( '1 articles (1 selected)', $output ); $this->assertStringContainsString( '