2011-09-08 06:10:56 +02:00
< ? php
/**
* Name : WordPress Post Connector
2012-01-27 02:12:10 +01:00
* Description : Post to WordPress ( or anything else which uses blogger XMLRPC API )
2017-01-24 21:07:44 +01:00
* Version : 1.1
2011-09-08 06:10:56 +02:00
* Author : Mike Macgirvin < http :// macgirvin . com / profile / mike >
*/
2018-03-07 22:48:34 +01:00
2018-01-27 02:04:00 +01:00
use Friendica\Content\Text\BBCode ;
2018-03-07 22:48:34 +01:00
use Friendica\Content\Text\HTML ;
2018-12-26 08:28:16 +01:00
use Friendica\Core\Hook ;
2018-10-30 00:40:18 +01:00
use Friendica\Core\Logger ;
2021-11-21 23:10:13 +01:00
use Friendica\Core\Renderer ;
2018-07-20 14:20:48 +02:00
use Friendica\Database\DBA ;
2019-12-30 03:55:10 +01:00
use Friendica\DI ;
2023-03-05 22:37:28 +01:00
use Friendica\Model\Item ;
2021-05-01 10:59:14 +02:00
use Friendica\Model\Post ;
2023-07-16 12:37:33 +02:00
use Friendica\Model\User ;
2018-11-05 13:47:04 +01:00
use Friendica\Util\XML ;
2017-11-07 00:55:24 +01:00
2018-11-10 17:20:19 +01:00
function wppost_install ()
{
2018-12-26 08:28:16 +01:00
Hook :: register ( 'hook_fork' , 'addon/wppost/wppost.php' , 'wppost_hook_fork' );
Hook :: register ( 'post_local' , 'addon/wppost/wppost.php' , 'wppost_post_local' );
Hook :: register ( 'notifier_normal' , 'addon/wppost/wppost.php' , 'wppost_send' );
Hook :: register ( 'jot_networks' , 'addon/wppost/wppost.php' , 'wppost_jot_nets' );
Hook :: register ( 'connector_settings' , 'addon/wppost/wppost.php' , 'wppost_settings' );
Hook :: register ( 'connector_settings_post' , 'addon/wppost/wppost.php' , 'wppost_settings_post' );
2011-09-08 06:10:56 +02:00
}
2011-10-12 03:46:33 +02:00
2023-01-14 03:16:09 +01:00
function wppost_jot_nets ( array & $jotnets_fields )
2018-11-10 17:20:19 +01:00
{
2022-10-20 23:51:49 +02:00
if ( ! DI :: userSession () -> getLocalUserId ()) {
2018-11-10 17:20:19 +01:00
return ;
}
2011-09-08 06:10:56 +02:00
2023-03-05 22:17:14 +01:00
if ( DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'post' )) {
2019-03-25 03:44:50 +01:00
$jotnets_fields [] = [
'type' => 'checkbox' ,
'field' => [
'wppost_enable' ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( 'Post to Wordpress' ),
2023-03-05 22:17:14 +01:00
DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'post_by_default' )
2019-03-25 03:44:50 +01:00
]
];
2018-11-10 17:20:19 +01:00
}
2011-09-08 06:10:56 +02:00
}
2023-01-14 03:16:09 +01:00
function wppost_settings ( array & $data )
2021-11-21 23:10:13 +01:00
{
2022-10-20 23:51:49 +02:00
if ( ! DI :: userSession () -> getLocalUserId ()) {
2014-05-29 12:42:25 +02:00
return ;
2021-11-21 23:10:13 +01:00
}
2011-09-08 06:10:56 +02:00
2022-10-20 23:51:49 +02:00
$enabled = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'post' , false );
$wp_username = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'wp_username' );
$wp_blog = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'wp_blog' );
$def_enabled = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'post_by_default' , false );
$back_enabled = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'backlink' , false );
$wp_backlink_text = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'wp_backlink_text' );
$shortcheck_enabled = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'shortcheck' , false );
2021-11-21 23:10:13 +01:00
$t = Renderer :: getMarkupTemplate ( 'connector_settings.tpl' , 'addon/wppost/' );
$html = Renderer :: replaceMacros ( $t , [
'$enabled' => [ 'wppost' , DI :: l10n () -> t ( 'Enable Wordpress Post Addon' ), $enabled ],
'$username' => [ 'wp_username' , DI :: l10n () -> t ( 'Wordpress username' ), $wp_username ],
'$password' => [ 'wp_password' , DI :: l10n () -> t ( 'Wordpress password' )],
'$blog' => [ 'wp_blog' , DI :: l10n () -> t ( 'WordPress API URL' ), $wp_blog ],
'$bydefault' => [ 'wp_bydefault' , DI :: l10n () -> t ( 'Post to Wordpress by default' ), $def_enabled ],
'$backlink' => [ 'wp_backlink' , DI :: l10n () -> t ( 'Provide a backlink to the Friendica post' ), $back_enabled ],
'$backlink_text' => [ 'wp_backlink_text' , DI :: l10n () -> t ( 'Text for the backlink, e.g. Read the original post and comment stream on Friendica.' ), $wp_backlink_text ],
'$shortcheck' => [ 'wp_shortcheck' , DI :: l10n () -> t ( 'Don\'t post messages that are too short' ), $shortcheck_enabled ],
]);
$data = [
'connector' => 'wppost' ,
'title' => DI :: l10n () -> t ( 'Wordpress Export' ),
'image' => 'images/wordpress.png' ,
'enabled' => $enabled ,
'html' => $html ,
];
2011-09-08 06:10:56 +02:00
}
2023-01-14 03:16:09 +01:00
function wppost_settings_post ( array & $b )
2020-11-20 15:11:49 +01:00
{
2023-03-05 22:17:14 +01:00
if ( ! empty ( $_POST [ 'wppost-submit' ])) {
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'post' , intval ( $_POST [ 'wppost' ]));
2022-10-20 23:51:49 +02:00
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'post_by_default' , intval ( $_POST [ 'wp_bydefault' ]));
2023-03-05 22:17:14 +01:00
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'wp_username' , trim ( $_POST [ 'wp_username' ]));
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'wp_password' , trim ( $_POST [ 'wp_password' ]));
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'wp_blog' , trim ( $_POST [ 'wp_blog' ]));
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'backlink' , intval ( $_POST [ 'wp_backlink' ]));
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'shortcheck' , intval ( $_POST [ 'wp_shortcheck' ]));
2023-07-16 12:37:33 +02:00
$wp_backlink_text = BBCode :: convertForUriId ( User :: getSystemUriId (), trim ( $_POST [ 'wp_backlink_text' ]), BBCode :: BACKLINK );
2018-03-07 22:48:34 +01:00
$wp_backlink_text = HTML :: toPlaintext ( $wp_backlink_text , 0 , true );
2022-10-20 23:51:49 +02:00
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'wp_backlink_text' , $wp_backlink_text );
2011-09-08 06:10:56 +02:00
}
}
2023-01-14 03:16:09 +01:00
function wppost_hook_fork ( array & $b )
2018-11-10 17:20:19 +01:00
{
if ( $b [ 'name' ] != 'notifier_normal' ) {
return ;
}
$post = $b [ 'data' ];
2023-03-05 22:17:14 +01:00
if (
2024-11-16 06:42:00 +01:00
$post [ 'deleted' ] || ( $post [ 'private' ] == Item :: PRIVATE ) || ( $post [ 'created' ] !== $post [ 'edited' ]) ||
! strstr ( $post [ 'postopts' ] ? ? '' , 'wppost' ) || ( $post [ 'gravity' ] != Item :: GRAVITY_PARENT )
2023-03-05 22:17:14 +01:00
) {
2018-11-10 17:20:19 +01:00
$b [ 'execute' ] = false ;
return ;
}
}
2023-03-05 22:17:14 +01:00
function wppost_post_local ( array & $b )
{
2022-10-20 23:51:49 +02:00
if ( ! DI :: userSession () -> getLocalUserId () || ( DI :: userSession () -> getLocalUserId () != $b [ 'uid' ])) {
2011-09-08 06:10:56 +02:00
return ;
2017-01-24 21:07:44 +01:00
}
2011-09-08 06:10:56 +02:00
2024-11-16 06:42:00 +01:00
// This can probably be changed to allow editing by pointing to a different API endpoint
if ( $b [ 'edit' ] || ( $b [ 'private' ] == Item :: PRIVATE ) || ( $b [ 'gravity' ] != Item :: GRAVITY_PARENT )) {
2011-09-08 06:10:56 +02:00
return ;
2017-01-24 21:07:44 +01:00
}
2011-09-08 06:10:56 +02:00
2022-10-20 23:51:49 +02:00
$wp_post = intval ( DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'post' ));
2011-09-08 06:10:56 +02:00
2018-11-30 15:11:56 +01:00
$wp_enable = (( $wp_post && ! empty ( $_REQUEST [ 'wppost_enable' ])) ? intval ( $_REQUEST [ 'wppost_enable' ]) : 0 );
2011-09-08 06:10:56 +02:00
2022-10-20 23:51:49 +02:00
if ( $b [ 'api_source' ] && intval ( DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'wppost' , 'post_by_default' ))) {
2011-09-08 06:10:56 +02:00
$wp_enable = 1 ;
2017-01-24 21:07:44 +01:00
}
2011-09-08 06:10:56 +02:00
2017-09-06 18:16:33 +02:00
if ( ! $wp_enable ) {
return ;
}
2011-10-12 03:46:33 +02:00
2017-09-06 18:16:33 +02:00
if ( strlen ( $b [ 'postopts' ])) {
$b [ 'postopts' ] .= ',' ;
}
$b [ 'postopts' ] .= 'wppost' ;
2011-10-12 03:46:33 +02:00
}
2023-01-14 03:16:09 +01:00
function wppost_send ( array & $b )
2018-11-24 01:21:51 +01:00
{
2024-11-16 06:42:00 +01:00
if ( $b [ 'deleted' ] || ( $b [ 'private' ] == Item :: PRIVATE ) || ( $b [ 'created' ] !== $b [ 'edited' ])) {
2014-05-29 12:42:25 +02:00
return ;
2018-01-10 04:27:40 +01:00
}
2011-10-12 03:46:33 +02:00
2023-03-05 22:17:14 +01:00
if ( ! strstr ( $b [ 'postopts' ], 'wppost' )) {
2014-05-29 12:42:25 +02:00
return ;
2018-01-10 04:27:40 +01:00
}
2011-10-12 03:46:33 +02:00
2023-03-05 22:17:14 +01:00
if ( $b [ 'gravity' ] != Item :: GRAVITY_PARENT ) {
2014-05-29 12:42:25 +02:00
return ;
2018-01-10 04:27:40 +01:00
}
2011-10-12 03:46:33 +02:00
2017-11-26 00:56:18 +01:00
// Dont't post if the post doesn't belong to us.
2023-06-03 21:57:29 +02:00
// This is a check for group postings
2018-07-20 14:20:48 +02:00
$self = DBA :: selectFirst ( 'contact' , [ 'id' ], [ 'uid' => $b [ 'uid' ], 'self' => true ]);
2017-11-26 00:56:18 +01:00
if ( $b [ 'contact-id' ] != $self [ 'id' ]) {
return ;
}
2011-10-12 03:46:33 +02:00
2022-10-30 00:14:12 +02:00
$b [ 'body' ] = Post\Media :: addAttachmentsToBody ( $b [ 'uri-id' ], DI :: contentItem () -> addSharedPost ( $b ));
2021-05-01 10:59:14 +02:00
2020-01-18 16:50:56 +01:00
$wp_username = XML :: escape ( DI :: pConfig () -> get ( $b [ 'uid' ], 'wppost' , 'wp_username' ));
$wp_password = XML :: escape ( DI :: pConfig () -> get ( $b [ 'uid' ], 'wppost' , 'wp_password' ));
2023-03-05 22:17:14 +01:00
$wp_blog = DI :: pConfig () -> get ( $b [ 'uid' ], 'wppost' , 'wp_blog' );
$wp_backlink_text = DI :: pConfig () -> get ( $b [ 'uid' ], 'wppost' , 'wp_backlink_text' );
2017-01-24 21:07:44 +01:00
if ( $wp_backlink_text == '' ) {
2020-01-18 20:52:33 +01:00
$wp_backlink_text = DI :: l10n () -> t ( 'Read the orig i nal post and com ment stream on Friendica' );
2017-01-24 21:07:44 +01:00
}
2011-10-12 03:46:33 +02:00
2018-01-27 01:26:37 +01:00
if ( $wp_username && $wp_password && $wp_blog ) {
2012-06-18 01:30:44 +02:00
$wptitle = trim ( $b [ 'title' ]);
2020-01-18 16:50:56 +01:00
if ( intval ( DI :: pConfig () -> get ( $b [ 'uid' ], 'wppost' , 'shortcheck' ))) {
2014-05-29 12:42:25 +02:00
// Checking, if its a post that is worth a blog post
2023-03-05 22:17:14 +01:00
$postentry = ( bool ) Post\Media :: getByURIId ( $b [ 'uri-id' ], [ Post\Media :: HTML , Post\Media :: AUDIO , Post\Media :: VIDEO , Post\Media :: IMAGE ]);
2014-05-29 12:42:25 +02:00
// Does it have a title?
2017-01-24 21:07:44 +01:00
if ( $wptitle != " " ) {
2014-05-29 12:42:25 +02:00
$postentry = true ;
2017-01-24 21:07:44 +01:00
}
2014-05-29 12:42:25 +02:00
// Is it larger than 500 characters?
2017-01-24 21:07:44 +01:00
if ( strlen ( $b [ 'body' ]) > 500 ) {
2014-05-29 12:42:25 +02:00
$postentry = true ;
2017-01-24 21:07:44 +01:00
}
2014-05-29 12:42:25 +02:00
2017-01-24 21:07:44 +01:00
if ( ! $postentry ) {
2014-05-29 12:42:25 +02:00
return ;
2017-01-24 21:07:44 +01:00
}
2014-05-29 12:42:25 +02:00
}
2012-04-01 19:20:40 +02:00
// If the title is empty then try to guess
2012-06-18 01:30:44 +02:00
if ( $wptitle == '' ) {
2016-06-23 20:25:00 +02:00
// Fetch information about the post
2023-03-05 22:17:14 +01:00
$media = Post\Media :: getByURIId ( $b [ 'uri-id' ], [ Post\Media :: HTML ]);
if ( ! empty ( $media ) && ! empty ( $media [ 0 ][ 'name' ]) && ( $media [ 0 ][ 'name' ] != $media [ 0 ][ 'url' ])) {
$wptitle = $media [ 0 ][ 'name' ];
2017-01-24 21:07:44 +01:00
}
2012-04-01 19:20:40 +02:00
// If no bookmark is found then take the first line
2012-06-18 01:30:44 +02:00
if ( $wptitle == '' ) {
2014-01-26 09:53:12 +01:00
// Remove the share element before fetching the first line
2020-11-20 15:11:49 +01:00
$title = trim ( preg_replace ( " / \ [share.*? \ ](.*?) \ [ \ /share \ ]/ism " , " \n $ 1 \n " , $b [ 'body' ]));
2014-01-26 09:53:12 +01:00
2023-03-05 22:17:14 +01:00
$title = BBCode :: toPlaintext ( $title ) . " \n " ;
2012-04-01 19:20:40 +02:00
$pos = strpos ( $title , " \n " );
2013-07-14 14:58:12 +02:00
$trailer = " " ;
2017-06-09 03:20:27 +02:00
if (( $pos == 0 ) || ( $pos > 100 )) {
2013-07-14 14:58:12 +02:00
$pos = 100 ;
$trailer = " ... " ;
}
2012-04-01 19:20:40 +02:00
2023-03-05 22:17:14 +01:00
$wptitle = substr ( $title , 0 , $pos ) . $trailer ;
2012-04-01 19:20:40 +02:00
}
}
2011-09-08 06:33:54 +02:00
2020-01-18 20:52:33 +01:00
$title = '<title>' . (( $wptitle ) ? $wptitle : DI :: l10n () -> t ( 'Post from Friendica' )) . '</title>' ;
2021-07-10 09:40:39 +02:00
$post = BBCode :: convertForUriId ( $b [ 'uri-id' ], $b [ 'body' ], BBCode :: CONNECTORS );
2013-07-20 14:28:17 +02:00
// If a link goes to youtube then remove the stuff around it. Wordpress detects youtube links and embeds it
2020-11-20 15:11:49 +01:00
$post = preg_replace ( '/<a.*?href="(https?:\/\/www.youtube.com\/.*?)".*?>(.*?)<\/a>/ism' , " \n $ 1 \n " , $post );
$post = preg_replace ( '/<a.*?href="(https?:\/\/youtu.be\/.*?)".*?>(.*?)<\/a>/ism' , " \n $ 1 \n " , $post );
2013-07-20 14:28:17 +02:00
2023-03-05 22:17:14 +01:00
$post = $title . $post ;
2012-05-15 01:30:18 +02:00
2023-03-05 22:17:14 +01:00
$wp_backlink = intval ( DI :: pConfig () -> get ( $b [ 'uid' ], 'wppost' , 'backlink' ));
if ( $wp_backlink && $b [ 'plink' ]) {
2022-10-18 14:58:11 +02:00
$post .= '<p><a href="' . $b [ 'plink' ] . '">' . $wp_backlink_text . '</a></p>' ;
2017-01-24 21:07:44 +01:00
}
2012-05-15 01:30:18 +02:00
2018-11-05 13:47:04 +01:00
$post = XML :: escape ( $post );
2011-09-08 06:10:56 +02:00
2012-05-15 01:30:18 +02:00
2011-09-08 06:10:56 +02:00
$xml = <<< EOT
2012-02-28 08:19:25 +01:00
< ? xml version = \ " 1.0 \" encoding= \" utf-8 \" ?>
2011-09-08 06:10:56 +02:00
< methodCall >
< methodName > blogger . newPost </ methodName >
< params >
< param >< value >< string /></ value ></ param >
< param >< value >< string /></ value ></ param >
< param >< value >< string > $wp_username </ string ></ value ></ param >
< param >< value >< string > $wp_password </ string ></ value ></ param >
< param >< value >< string > $post </ string ></ value ></ param >
< param >< value >< int > 1 </ int ></ value ></ param >
</ params >
</ methodCall >
EOT ;
2021-10-21 08:04:27 +02:00
Logger :: debug ( 'wppost: data: ' . $xml );
2011-09-08 06:10:56 +02:00
2018-01-27 14:52:02 +01:00
if ( $wp_blog !== 'test' ) {
2024-01-12 07:16:01 +01:00
$x = DI :: httpClient () -> post ( $wp_blog , $xml ) -> getBodyString ();
2017-01-24 21:07:44 +01:00
}
2021-10-21 08:04:27 +02:00
Logger :: info ( 'posted to wordpress: ' . (( $x ) ? $x : '' ));
2011-09-08 06:10:56 +02:00
}
}